# -*- coding: utf-8 -*-
import base64
import datetime
import json
import random
import ssl
import string
import time
from binascii import a2b_hex
from typing import Union

from faker import Faker

import requests
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad

from info.utils import utils

ssl._create_default_https_context = ssl._create_unverified_context
requests.packages.urllib3.disable_warnings()

value = None
timeout = 60


class PrpCrypt(object):
    def __init__(self, key="ZTE@FSSCZTE@FSSC"):
        self.key = key.encode('utf-8')
        self.mode = AES.MODE_ECB

    def pad_byte(self, b):
        return pad(b, AES.block_size)

    def encrypt(self, text):
        """
        1 先生成aes实例
        2 对传入的text转成bytes
        3 对传入的text补全
        4 调用encrypt 加密 得到密文
        5 先将密文转16进制，在将16进制用base64转码，然后在将得到的base64解码

        :param text:
        :return:
        """
        cryptor = AES.new(self.key, self.mode)
        text = text.encode('utf-8')
        text = self.pad_byte(text)
        ciphertext = cryptor.encrypt(text)
        cryptbase64 = base64.b64encode(ciphertext)
        cryptbase64 = cryptbase64.decode("utf-8")
        return cryptbase64

    def decrypt(self, text):
        """
        解密和加密的顺序是相反的
        1 定义匿名函数，去掉补位
        2 base64解码
        3 生成aes实例
        4 16进制转2进制
        5 使用decrypt解码  得到补全的bytes类型明文

        :param text:
        :return:  解密且去掉补位的明文
        """

        def unpad(s): return s[:-ord(s[len(s) - 1:])]

        base64Str = base64.b64decode(text.encode('utf8'))
        cryptor = AES.new(self.key, self.mode)
        aesStr = cryptor.decrypt(a2b_hex(base64Str))
        aesStr = str(unpad(aesStr), encoding='utf8')
        return aesStr


class ZTCCLOUD(object):

    @staticmethod
    def GET_DICT(dict1, values, **kwargs):
        """
        从响应中根据key获取对应的值(第一个)
        :param dict1: 响应结果json
        :param values: key
        :param **kwargs: 增加筛选条件，字典中满足kwarg传入的‘查询条件key’=‘value’时，才取‘目标key’对应的值，否则忽略
        :return: 查到的值(str)
        """
        value = ""
        values1 = values

        def GET_LIST(list1, values1):
            for i in list1:

                if isinstance(i, dict):
                    global value
                    value = ZTCCLOUD.GET_DICT(i, values1, **kwargs)
                elif isinstance(i, list):
                    value = GET_LIST(i, values1)
                else:
                    continue
                if value:
                    return value

        for k, v in dict1.items():
            if value:
                break
            flag = True
            for kwargsK, kwargsV in kwargs.items():
                if dict1.get(kwargsK) != kwargsV:
                    flag = False
            if k == values:
                if flag:
                    value = v
                    return value
            elif isinstance(v, dict):
                value = ZTCCLOUD.GET_DICT(v, values1, **kwargs)
            elif isinstance(v, list):  # 判断类型是不是list
                value = GET_LIST(v, values1)
            else:
                continue
            if value:
                return value

        return value

    @staticmethod
    def GET_VALUE_FROM_JSON_DICT(_obj, key, **kwargs):
        """
        从响应中根据key获取值(所有)
        :param _obj: 响应结果json
        :param key: 目标key, 单个传str。多个传list，只支持同层的多个，同层次全部key都存在时才有返回
        :param **kwargs: 增加筛选条件，字典中满足kwarg传入的‘查询条件key’=‘value’时，才取‘目标key’对应的值，否则忽略。可有多个筛选条件
        :return: 查到的值(list)
        """
        ret = []
        if isinstance(key, str):
            key_list = [key]
        elif isinstance(key, list):
            key_list = key
        else:
            print('目标key传值有误，只支持查单个：str或查多个：list')
            return ret

        # print(f"----------->过滤查询条件：{kwargs}")
        def _get_value_from_json_dict(_obj, _key_list, **kwargs):
            if isinstance(_obj, list):
                for _i in _obj:
                    _get_value_from_json_dict(_i, _key_list, **kwargs)
            elif isinstance(_obj, dict):
                flag = True  # 筛选条件状态标记，默认满足为True
                for kwargsK, kwargsV in kwargs.items():
                    if _obj.get(kwargsK) != kwargsV:
                        flag = False
                list_total = []
                for _k, _v in _obj.items():

                    for i in range(len(_key_list)):
                        if _k == _key_list[i]:
                            list_total.append(_v)
                    if flag and len(list_total) == len(_key_list):  # 同一层，都拿到了，才加入返回序列
                        if len(list_total) == 1:
                            ret.append(list_total[0])
                        else:
                            ret.append(list_total)
                        list_total = []
                    else:
                        _get_value_from_json_dict(_v, _key_list, **kwargs)
            else:
                return

        _get_value_from_json_dict(_obj, key_list, **kwargs)

        return ret

    @staticmethod
    def GET_VALUES_FROM_JSON_DICT(_obj, key, **kwargs):
        """
        从响应中根据key获取值(所有)
        :param _obj: 响应结果json
        :param key_list: 目标key多个，传入list
        :param **kwargs: 增加筛选条件，字典中满足kwarg传入的‘查询条件key’=‘value’时，才取‘目标key’对应的值，否则忽略
        :return: 查到的值(list)
        """
        ret = []
        if isinstance(key, str):
            key_list = [key]
        elif isinstance(key, list):
            key_list = key
        else:
            print('目标key传值有误，只支持查单个：str或查多个：list')
            return ret

        # print(f"----------->过滤查询条件：{kwargs}")
        def _get_value_from_json_dict(_obj, _key_list, **kwargs):
            if isinstance(_obj, list):
                for _i in _obj:
                    _get_value_from_json_dict(_i, _key_list, **kwargs)
            elif isinstance(_obj, dict):
                flag = True  # 筛选条件状态标记
                for kwargsK, kwargsV in kwargs.items():
                    if _obj.get(kwargsK) != kwargsV:
                        flag = False
                list_total = []
                for _k, _v in _obj.items():
                    if _k in _key_list:
                        list_total.append(_v)
                        if len(list_total) == len(_key_list) and flag:  # 同一层，都拿到了，才加入返回序列
                            ret.append(list_total)
                    else:
                        _get_value_from_json_dict(_v, _key_list, **kwargs)
            else:
                return

        _get_value_from_json_dict(_obj, key_list, **kwargs)

        return ret

    @staticmethod
    def random_character(char_type="int", length: Union[str, int] = "4"):
        """
        根据字符类型和长度生成随机字符
        :param char_type: 字符类型，默认值为int  多种类型组合请使用^连接，例如：int^str^punctuation
            可选项：
                {
                    "int": 0-9数字，
                    "lowercase": 小写英文字母,
                    "uppercase": 大写英文字母,
                    "str": 大写+小写 英文字母,
                    "hexdigits": 十六进制字符,
                    "octdigits": 八进制字符,
                    "punctuation": 特殊字符,
                    "all": 以上所有组合
                }
        :param length: 所需生成的字符长度，默认值为4
        :return:
        """
        d = {
            "int": string.digits,
            "lowercase": string.ascii_lowercase,
            "uppercase": string.ascii_uppercase,
            "whitespace": string.whitespace,
            "str": string.ascii_letters,
            "hexdigits": string.hexdigits,
            "octdigits": string.octdigits,
            "punctuation": string.punctuation,
            "all": string.digits + string.ascii_letters + string.punctuation
        }
        try:
            length = int(length)
        except ValueError as e:
            raise ValueError("长度(length字段)只能输入数字，请重新输入")
        s = ""
        for i in char_type.split("^"):
            r = d.get(i)
            if not r:
                raise ValueError(f"当前只支持 {list(d.keys())} {len(d.keys())}种选项组合，请重新选择")
            s += r
        return "".join(random.choice(s) for _ in range(length))

    def FINDDATA(self, serverIp, cookie, data, url="/sys/base/lov/findDatas"):
        """获取LOV数据。data：请求体数据"""
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        try:
            data = eval(data)
        except:
            pass
        # print(f"---------->请求体：\n{data}\n")
        response = requests.post(timeout=timeout, url=request_url, headers=headers, data=data.encode('utf-8'))
        # print(f"----------> 获取LOV数据  接口响应：{response.text}")
        assert response.status_code == 200
        return response.json()

    def GET_USER_COOKIE(
            self,
            serverIp,
            user_name,
            password,
            login_url="/sys/auth/login",
            *args,
            **kwargs):
        """
        共享系统获取cookie
        :param serverIp:
        :param user_name:
        :param password:
        :param protocol:
        :param port:
        :param login_url:
        :param args:
        :param kwargs:
        :return:
        """
        request_url = serverIp + login_url
        headers = {
            "Content-Type": "application/x-www-form-urlencoded"
        }
        data = {
            "loginKey": user_name,
            "password": PrpCrypt().encrypt(password),
            "multiGroup": "true",
            "loginPlatform": "PC"
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data)
        try:
            assert response.status_code == 200
            assert "success" in response.text
        except BaseException:
            # sg.popup_quick_message("登录出现异常，请检查测试环境", title="异常")
            return False
        cookies = response.cookies.get_dict()
        cookie = f"{list(cookies.keys())[0]}={list(cookies.values())[0]}"
        return cookie

    def GET_USER_AUTH(
            self,
            serverIp,
            user_name,
            password,
            login_url="/evssys/init/login",
            *args,
            **kwargs):
        """
        影像、档案系统获取authorization
        :param serverIp:
        :param user_name:
        :param password:
        :param protocol:
        :param port:
        :param login_url:
        :param args:
        :param kwargs:
        :return:
        """
        request_url = serverIp + login_url
        headers = {
            "Content-Type": "application/json"
        }
        data = {
            "username": user_name,
            "password": password,
            "language": "zh_CN"
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=json.dumps(data))
        try:
            assert "true" in response.text
        except BaseException:
            # sg.popup_quick_message("登录出现异常，请检查测试环境", title="异常")
            return False
        Authorization = response.json().get("Authorization")
        return Authorization

    def QUERY_DEPT_FINDCHILDRENBYIDANDVALIDITY(
            self,
            baseIp,
            cookie,
            data=None,
            url="/sys/common/dept/findChildrenByIdAndValidity",
            *args,
            **kwargs):
        """
        基础数据-组织数据-公司部门 查询当前集团在部门表中的id
        \n:return id
        """
        request_url = baseIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        if data:
            kwargs.update(eval(data))
        data = {
            "pid": "0",
            "validityFlag": "0",
            "org": "0^1^2^4"
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=json.dumps(data))
        # print(
        #     f"----------> 基础配置-流程配置-审批角色线 查询当前集团在部门表中的id 接口响应：{response.text}")
        assert response.status_code == 200, "{} 接口响应状态码不是200".format(
            self.__doc__.split("\n")[1].strip("\t"))
        return response.json().get("tree")[0].get("id")

    def QUERY_DEPT_FINDPARENTBYNAMEANDVALIDITY(
            self,
            baseIp,
            cookie,
            code=None,
            name=None,
            data=None,
            url="/sys/common/dept/findParentByNameAndValidity",
            *args,
            **kwargs):
        """
        基础数据-组织数据-公司部门 按名称关键字过滤公司/部门/岗位/人员信息(左侧树)
        \n:param name: 名称关键字
        """
        request_url = baseIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        if data:
            kwargs.update(eval(data))
        data = {
            "name": name,
            "code": code
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=json.dumps(data))
        # print(
        #     f"----------> 基础配置-流程配置-审批角色线 按名称关键字过滤公司/部门/岗位/人员信息(左侧树) 接口响应：{response.text}")
        assert response.status_code == 200, "{} 接口响应状态码不是200".format(
            self.__doc__.split("\n")[1].strip("\t"))
        return response.json()

    def ADD_COMMON_DEPT(
            self,
            baseIp,
            cookie,
            dType,
            code,
            name_zh_CN,
            deptLevel,
            pid,
            deptFid,
            data=None,
            url="/sys/common/dept",
            *args,
            **kwargs):
        """
        基础数据-组织数据-公司部门 新增公司/部门/岗位/人员
        \n:param dType: 类型  枚举值：{'0': '公司'， ‘1’: '部门', '2': '岗位', '3': '人员', '4': '集团'}
        \n:param code: 编码
        \n:param name_zh_CN: 名称(中)
        \n:param deptLevel: 级别  枚举值：{'LV1': '一级', 'LV2': '二级', 'LV3': '三级', 'LV4': '四级', 'LV5': '五级'}  新建岗位时，传入任意值
        \n:param pid: 父级Id
        \n:param deptFid: 级别顺序Id、类型序列  Id与类型之间用^拼接，多个值之间用/拼接  例如：/集团Id^4/公司Id^0/部门Id^1/岗位Id^2/......

        如果要传入其他参数，请参照下列示例：
        新建公司：
                名称(En)：name_en_US=名称(En)
                负责人：leaderId=负责人Id
                第二负责人：leaderSecId=第二负责人Id
                法人：legalPerson=法人Id

        新建部门：
                名称(En)：name_en_US=名称(En)
                部门负责人：leaderId=部门负责人Id
                部门分管领导：leaderSecId=部门分管领导Id
                法人：legalPerson=法人Id
                部门属性：funArea=部门属性  枚举值：{'DEP4': '管理', 'DEP0': '咨询', 'DET3': '销售', 'DEP1': '研发', 'DEP2': '生产'}

        新建岗位：
                名称(En)：name_en_US=名称(En)
        """
        request_url = baseIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        if data:
            kwargs.update(eval(data))
        data = {
            # "deptFname": "深圳市中兴新云服务有限公司/ZTESSC",
            "type": dType,
            "code": code,
            "name_zh-CN": name_zh_CN,
            "name_en-US": kwargs.get("name_en_US") or kwargs.get("name_en-US"),
            "leaderId": kwargs.get("leaderId"),
            # "leaderName": "财务审批",
            "leaderSecId": kwargs.get("leaderSecId"),
            # "leaderSecName": "嘤嘤弦",
            "legalPerson": kwargs.get("legalPerson"),
            # "legalPersonName": "申能集团商务服务有限公司",
            "deptLevel": deptLevel,
            "ccName": "",
            "validityFlag": "0",
            "deptFid": deptFid,
            # "deptFno": "ZTESSC",
            "pid": pid,
            "languages": [
                {
                    "language": "zh-CN",
                    "name": name_zh_CN
                },
                {
                    "language": "en-US",
                    "name": kwargs.get("name_en_US") or kwargs.get("name_en-US")
                }
            ]
        }
        if str(dType) == "1":
            data["funArea"] = kwargs.get("funArea")
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=json.dumps(data))
        # print(f"----------> 基础数据-组织数据-公司部门 新增公司/部门/岗位/人员 接口响应：{response.text}")
        assert response.status_code == 200, "{} 接口响应状态码不是200".format(
            self.__doc__.split("\n")[1].strip("\t"))
        return response.json()

    def ADD_COMMON_EMP(
            self,
            baseIp,
            cookie,
            empNo,
            realName_zh_CN,
            gender='0',
            permanentLand=None,
            data=None,
            url="/sys/common/emp",
            *args,
            **kwargs):
        """
        基础数据-组织数据-员工信息 新增员工(必填信息，后期补充)
        \n:param empNo: 员工工号
        \n:param realName_zh_CN: 员工工号
        \n:param gender: 性别  枚举值：{'0': '男', '1': '女'}
        \n:param permanentLand: 常驻地Id  多个值用^连接，例如：id1^id2^...

        如果要传入其他参数，请参照下列示例：
                邮箱：email=邮箱地址
                微信：wxNumber=微信号
                钉钉：ddNumber=钉钉号
                是否生成用户：haveAccount=Y  枚举值：{'Y': '生成用户', 'N': '不生成用户'}
                手机：mobile=手机号
                主岗：mainPost=岗位id
                兼岗：accessoryPost=['id1', 'id2']
        """

        # 查个驻地id
        permanentLand_temp = None
        try:
            if not permanentLand:
                permanentLand_temp = self.QUERY_CITY_INFO(baseIp, cookie)
        except:
            pass
        request_url = baseIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        if data:
            kwargs.update(eval(data))
        # # sg.popup_yes_no(f'{kwargs.get("accessoryPost")},,,{type(kwargs.get("accessoryPost"))}')
        accessoryPost = kwargs.get("accessoryPost") if (
                kwargs.get("accessoryPost") and isinstance(kwargs.get("accessoryPost"), list)) else []
        data = {
            "empNo": empNo,
            "realName_zh-CN": realName_zh_CN,
            "realName_en-US": "",
            "gender": gender if gender else '0',
            "permanentLand": permanentLand if permanentLand else permanentLand_temp,
            "permanentLandName": "",
            "mainPost": kwargs.get("mainPost"),
            "mainPostName": kwargs.get("mainPostName"),
            "deptFname": "",
            "companyId": kwargs.get("companyId"),
            "companyName": kwargs.get("companyName"),
            "superLeaderId": kwargs.get("superLeaderId"),
            "superLeaderName": kwargs.get("superLeaderName"),
            "position": "",
            "title": "",
            "travelLevel": "",
            "mobile": kwargs.get("mobile"),
            "messageType": [
                # "noticeEmail",
                # "noticeWx",
                # "noticeDd"
            ],
            "email": kwargs.get("email"),
            "wxNumber": kwargs.get("wxNumber"),
            "ddNumber": kwargs.get("ddNumber"),
            "haveAccount": kwargs.get("haveAccount"),
            "USER_ID": "",
            "languages": [
                {
                    "language": "zh-CN",
                    "realName": realName_zh_CN
                },
                {
                    "language": "en-US",
                    "realName": ""
                }
            ],
            "noticeEmail": kwargs.get("noticeEmail") or 1,
            "noticeWx": kwargs.get("noticeWx") or 1,
            "noticeDd": kwargs.get("noticeDd") or 1,
            "vendorsBank": [],
            "accessoryPost": accessoryPost,
            "superLeaderIds": [""] * len(accessoryPost),  # superLeaderIds列表元素数量需与accessoryPost一一对应，无则补""
            "positions": [""] * len(accessoryPost),
            "titles": [""] * len(accessoryPost),
            "travelLevels": [""] * len(accessoryPost)
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=json.dumps(data))
        # print(f"----------> 基础数据-组织数据-员工信息 新增员工 接口响应：{response.text}")

        assert response.status_code == 200, "{} 接口响应状态码不是200".format(
            self.__doc__.split("\n")[1].strip("\t"))
        return response.json()

    def QUERY_CITY_INFO(
            self,
            baseIp,
            cookie,
            data=None,
            url="/sys/base/lov/findDatas",
            *args,
            **kwargs):
        """
        基础数据-组织数据-员工信息-新增 查询常驻地信息
        随即返回一个驻地城市的id

        如果要传入其他参数，请参照下列示例：
                编码：CODE=编码
                城市名称：CITY_NAME=城市名称
        """
        request_url = baseIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        if data:
            kwargs.update(eval(data))
        data = {
            "page": kwargs.get("page") or "1",
            "limit": kwargs.get("limit") or "5",
            "orderField": kwargs.get("orderField"),
            "order": kwargs.get("order"),
            "CODE": kwargs.get("CODE"),
            "CITY_NAME": kwargs.get("CITY_NAME"),
            "lovKey": "sysCityMode.findCity"
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data)
        # print(f"----------> 基础数据-组织数据-员工信息-新增 查询常驻地信息 接口响应：{response.text}")
        assert response.status_code == 200, "{} 接口响应状态码不是200".format(
            self.__doc__.split("\n")[1].strip("\t"))
        num = random.randint(0, 4)
        city_id = response.json().get("page").get("list")[num].get("ID")
        return city_id

    def FINDDATAS_SplitWord(
            self,
            baseIp,
            cookie,
            page=1,
            limit=20,
            data=None,
            url="/sys/base/bankunitedcode/pageForSplitWord",
            *args,
            **kwargs):
        api_name = "基础数据-业务数据-客商管理 银行信息-开户行查询"
        request_url = baseIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        data = f"page={page}&limit={limit}&orderField=&order=&lovKey=&hasCount="
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json().get('page').get('list')

    def FINDDATAS_LE_VENDORS(
            self,
            baseIp,
            cookie,
            page=1,
            limit=20,
            url="/sys/base/lov/findDatas",
            *args,
            **kwargs):
        api_name = "基础数据-业务数据-客商管理 客商分配-核算主体"
        request_url = baseIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        data = f"page={page}&limit={limit}&orderField=&order=&lovKey=sysVendorMode.findFuLeMulti&hasCount="
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def ADD_VENDORS(
            self,
            baseIp,
            cookie,
            vendorCode,
            vendorName,
            taxNumber,
            data=None,
            url="/sys/base/vendors",
            *args,
            **kwargs):
        """vendorsCompany: 非全局客商时可以传入核算主体id列表用于客商分配核算主体"""
        api_name = "基础数据-业务数据-客商管理 新增"
        request_url = baseIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        vendorsCompany_list = []
        if kwargs.get('globalVendor') == '1':
            for le_id in kwargs.get('vendorsCompany'):
                dict1 = {
                    "fuName": "核算主体名称",
                    "leId": le_id
                }
                vendorsCompany_list.append(dict1)
        data = {
            "baseInfo": "",
            "vendorType": random.choice(["002", "003"]),
            "vendorCode": vendorCode if vendorCode else f"vendorCode{str(random.randint(0, 1000000))}",
            "vendorName_zh-CN": vendorName if vendorName else f"vendorName{str(random.randint(0, 1000000))}",
            "vendorName_en-US": "What are you talking about",
            "globalVendor": kwargs.get('globalVendor') or '0',
            "otherInfo": "What are you talking about",
            "taxNumber": taxNumber if taxNumber else "taxNumber",
            "taxpayerType": str(random.randint(0, 1)),
            "address": "梅溪湖边那条街",
            "telNum": f"1{time.strftime('%m%d%H%M%S', time.localtime(time.time()))}",
            "billBankName": f"billBankName",
            "billBankAccount": f"{time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))}",
            "internalUnitFlag": str(random.randint(0, 1)),
            "foreignLeId": kwargs.get('foreignLeId'),
            "foreignLeName": kwargs.get('foreignLeName'),
            "languages": [{
                "language": "zh-CN",
                "vendorName": vendorName if vendorName else f"vendorName{str(random.randint(0, 1000000))}"
            },
                {
                    "language": "en-US",
                    "vendorName": "What are you talking about"
                }],
            "vendors2": vendorsCompany_list,
            "vendorsBank": [{
                "bankAccountName": f"bankAccountName",
                "bankAccount": f"{time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))}",
                "subBank": kwargs.get("bankName") or kwargs.get("subBank"),
                "provinceName": kwargs.get("province") or kwargs.get("provinceName"),
                "cityName": kwargs.get("city") or kwargs.get("cityName"),
                "bankType": kwargs.get("bankType") or kwargs.get('bankHeadOffice'),
                "vendorSitesTypeName": str(random.randint(0, 1)),
                "defaultFlag": ["DF0001", "DF0002"][random.randint(0, 1)],
                "bankNum": kwargs.get("bankNum") or kwargs.get('bankTypeCode'),
                "unitedCode": kwargs.get(
                    "unitedCode") or f"{time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))}",
                "vendorSitesTypeNames": kwargs.get('vendorSitesTypeNames') or "随便对",
                "defaultFlagName": kwargs.get('defaultFlagName') or "不晓得"
            }]
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def SIMPLE_QUERY_VENDORS(
            self,
            serverIp,
            cookie,
            data=None,
            url="/sys/base/vendors/listSimple",
            *args,
            **kwargs):
        api_name = "基础数据-业务数据-客商管理 查询"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        page = kwargs.get('page') if kwargs.get('page') else '1'
        limit = kwargs.get('limit') if kwargs.get('limit') else '20'
        vendorType = kwargs.get('vendorType') if kwargs.get(
            'vendorType') else ''
        globalVendor_EQ = kwargs.get('globalVendor_EQ') if kwargs.get(
            'globalVendor_EQ') else ''
        code = kwargs.get('code') if kwargs.get('code') else ''
        name = kwargs.get('name') if kwargs.get('name') else ''
        validityFlag = kwargs.get('validityFlag') if kwargs.get(
            'validityFlag') else ''
        data = f"page={page}&limit={limit}&orderField=&order=&vendorType={vendorType}&globalVendor_EQ={globalVendor_EQ}" \
               f"&vendorCode={code}&vendorName={name}&validityFlag={validityFlag}&internalUnitFlag=&hasCount="
        numsas = 1
        while True:
            response = requests.post(
                timeout=timeout,
                url=request_url,
                headers=headers,
                data=data.encode('utf-8'))
            if "ERROR" not in response.text or numsas > 2:
                break
            numsas += 1

        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        # print(f"----------> {api_name} 接口响应：{response.text}")
        return response.json()

    def ADD_VENDORSCOMPANY(
            self,
            serverIp,
            cookie,
            leId, accountId, accountErpCode, accountErpName, vendorId, post='post',
            data=None,
            url="/sys/base/vendorsCompany",
            *args,
            **kwargs):
        api_name = "核算基础-SAP相关配置-客商科目分配 分配科目"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        data = {
            "leId": leId,
            "fuName": kwargs.get("fuName"),
            "accountId": accountId,
            "accountErpName": accountErpName,
            "id": kwargs.get("id"),
            "vendorId": vendorId,
            "accountErpCode": accountErpCode,
            "language": "zh-CN",
            "validityFlag": '0',
            "validityName": "有效",
            "createDate": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
            "initRowIndex": kwargs.get("initRowIndex")
        }
        if post == 'post':
            response = requests.post(
                timeout=timeout,
                url=request_url,
                headers=headers,
                json=data)
        else:
            response = requests.put(
                timeout=timeout,
                url=request_url,
                headers=headers,
                json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def QUERY_VENDORSCOMPANY(
            self,
            serverIp,
            cookie,
            data=None,
            url="/sys/base/vendorsCompany/page",
            **kwargs):
        """
        查询条件在ride使用"xxx"="yyy"的格式传入即可
        """
        api_name = "核算基础-SAP相关配置-客商科目分配 分页查询"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        # 原始基础条件
        page = kwargs.get('page') if kwargs.get('page') else '1'
        limit = kwargs.get('limit') if kwargs.get('limit') else '20'
        suite = {'page': page, 'limit': limit}
        kwargs.update(suite)
        dlist = []
        for key, value in kwargs.items():
            dlist.append(key + '=' + value)
        data = "&".join(dlist)

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data.encode('utf-8'))
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        # print(f"----------> {api_name} 接口响应：{response.text}")
        return response.json()

    def ADD_TEMP_VENDORS(
            self,
            baseIp,
            cookie,
            vendorName,
            bankAccountName,
            bankAccount,
            subBank="",
            bankType="",
            bankNum="",
            unitedCode="",
            provinceName="湖南",
            cityName="长沙",
            data=None,
            url="/sys/base/vendors/tempVendorBank/",
            *args,
            **kwargs):
        api_name = "基础数据-业务数据-临时供应商 新增"
        request_url = baseIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        data = {
            "vendorName": vendorName,
            "bankAccountName": bankAccountName,
            "bankAccount": bankAccount,
            "subBank": subBank if subBank else kwargs.get('bankName'),
            "unitedCode": unitedCode if unitedCode else kwargs.get('unitedCode'),
            "provinceName": provinceName if provinceName else kwargs.get('province'),
            "cityName": cityName if cityName else kwargs.get('city'),
            "bankType": bankType if bankType else kwargs.get('bankHeadOffice'),
            "vendorSitesTypeName": str(random.randint(1, 2)),
            "bankNum": bankNum if bankNum else kwargs.get('bankTypeCode')
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def FINDDATAS_RoleMode(
            self,
            baseIp,
            cookie,
            page=1,
            limit=20,
            url="/sys/base/lov/findDatas",
            *args,
            **kwargs):
        api_name = "基础数据-业务数据-项目管理 项目负责人LOV查询"
        request_url = baseIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        data = f"page={page}&limit={limit}&orderField=&order=&lovKey=sysRoleMode.findUserAccount&hasCount="
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def FINDDATAS_FuLeMulti(
            self,
            baseIp,
            cookie,
            page=1,
            limit=20,
            url="/sys/base/lov/findDatas",
            *args,
            **kwargs):
        api_name = "基础数据-业务数据-项目管理 核算主体LOV查询"
        request_url = baseIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        data = f"page={page}&limit={limit}&orderField=&order=&lovKey=sysVendorMode.findFuLeMulti&hasCount=N"
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def ADD_PROJECT(
            self,
            baseIp,
            cookie,
            code,
            name,
            principals,
            directors,
            fuId,
            data=None,
            url="/sys/base/project/",
            *args,
            **kwargs):
        api_name = "基础数据-业务数据-项目管理 新增"
        request_url = baseIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        project_list = ['xm001', 'CWIP', '06', '05', '04', '03', '02', '01', '13', '12', '11', '10', '09', '08', '07']
        projectAttribute_list = ["ITEM_PROJECT", "ADMINISTRATION_PROJECT", "CAPITAL_PROJECT", "INTRUST_PROJECT",
                                 "EXPENSE_PROJECT"]
        data = {
            "code": code,
            "name": name,
            "type": kwargs.get('type') if kwargs.get('type') else project_list[
                random.randint(0, len(project_list) - 1)],
            "projectAttribute": kwargs.get('projectAttribute') if kwargs.get('projectAttribute') else
            projectAttribute_list[random.randint(0, len(projectAttribute_list) - 1)],
            "projectBelong": kwargs.get('projectBelong') if kwargs.get('projectBelong') else "003",
            "principals": principals,
            "principalNames": "xxx乱写的",
            "directors": directors,
            "directorNames": "xxx乱写的",
            "publicProject": kwargs.get('publicProject') if kwargs.get('publicProject') else str(random.randint(0, 1)),
            "fuId": fuId,
            "fuName": "xxx乱写的"
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def ADD_FLEXVALUESETS(
            self,
            baseIp,
            cookie,
            flexValueSetCode,
            flexValueSetName,
            data=None,
            url="/sys/base/flexvaluesets",
            **kwargs):
        """
        flexValueSetType: "VST0002"
        dimensionPurposeMulti: "BUDGET^FIELD^STRUCTURES^AUTH"
        """
        api_name = "基础数据-业务数据-维度管理 新增"
        request_url = baseIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        data = {
            "flexValueSetCode": flexValueSetCode,
            "flexValueSetName": flexValueSetName,
            "flexValueSetType": "VST0002",  # 自定义维度
            "dimensionPurposeMulti": '^'.join(random.sample(["AUTH", "STRUCTURES", "FIELD"], random.randint(1, 3))),
            "applicationTableName": kwargs.get("applicationTableName"),
            "valueColumnCode": kwargs.get("valueColumnCode"),
            "valueColumnName": kwargs.get("valueColumnName"),
            "additionalWhereClause": kwargs.get("additionalWhereClause"),
            "sql": kwargs.get("sql")
        }
        # print(f"---------->{api_name} 接口请求体{data}")
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def QUERY_FLEXVALUESETS(
            self,
            serverIp,
            cookie,
            data=None,
            url="/sys/base/flexvaluesets/list",
            *args,
            **kwargs):
        api_name = "基础数据-业务数据-维度管理 查询"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        # 原始基础条件
        page = kwargs.get('page') if kwargs.get('page') else '1'
        limit = kwargs.get('limit') if kwargs.get('limit') else '20'
        validityFlag = kwargs.get('validityFlag') if kwargs.get('validityFlag') else '0'
        suite = {'page': page, 'limit': limit, 'validityFlag': validityFlag}
        kwargs.update(suite)
        dlist = []
        for key, value in kwargs.items():
            dlist.append(str(key) + '=' + str(value))
        data = "&".join(dlist)
        # print(f"---------->{api_name} 接口请求体{data.encode('utf-8')}")
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data.encode('utf-8'))
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        # print(f"----------> {api_name} 接口响应：{response.text}")
        return self.GET_VALUE_FROM_JSON_DICT(response.json(), "id")

    def ADD_FLEXVALUESETS_CUSTOM(
            self,
            baseIp,
            cookie,
            valueCode, valueRemark_zh_CN, valueSetId,
            data=None,
            url="/sys/base/flexvaluesetscustom",
            **kwargs):
        """
        flexValueSetType: "VST0002"
        dimensionPurposeMulti: "BUDGET^FIELD^STRUCTURES^AUTH"
        """
        api_name = "基础数据-业务数据-维度管理-成员管理 新增"
        request_url = baseIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        data = {
            "valueCode": valueCode,
            "valueRemark_zh-CN": valueRemark_zh_CN,
            "valueRemark_en-US": kwargs.get("valueRemark_en_US"),
            "fId": kwargs.get("fId"),
            "fCode": kwargs.get("fCode"),
            "fRemark": kwargs.get("fRemark"),
            "leId": kwargs.get("leId"),
            "leName": kwargs.get("leName"),
            "valueSetId": valueSetId,
            "languages": [
                {
                    "language": "zh-CN",
                    "valueRemark": valueRemark_zh_CN
                },
                {
                    "language": "en-US",
                    "valueRemark": kwargs.get("valueRemark")
                }
            ]
        }

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def ADD_SCHEME(
            self,
            serverIp,
            cookie,
            schemeCode,
            schemeName,
            data=None,
            url="/sys/base/coaaccountscheme",
            **kwargs):
        """
        schemeCode：科目编码
        schemeName：科目名称
        """
        api_name = "基础数据-财务数据-科目体系 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)

        data = {
            "schemeCode": schemeCode,
            "schemeName": schemeName
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def QUERY_SCHEME(
            self,
            serverIp,
            cookie,
            data=None,
            url="/sys/base/coaaccountscheme/page",
            **kwargs):
        """
        查询条件在ride使用"xxx"="yyy"的格式传入即可
        """
        api_name = "基础数据-财务数据-科目体系 分页查询"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        # 原始基础条件
        page = kwargs.get('page') if kwargs.get('page') else '1'
        limit = kwargs.get('limit') if kwargs.get('limit') else '20'
        suite = {'page': page, 'limit': limit}
        kwargs.update(suite)
        dlist = []
        for key, value in kwargs.items():
            dlist.append(str(key) + '=' + str(value))
        data = "&".join(dlist)

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data.encode('utf-8'))
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        # print(f"----------> {api_name} 接口响应：{response.text}")
        return self.GET_VALUE_FROM_JSON_DICT(response.json(), 'id')

    def QUERY_COA(
            self,
            serverIp,
            cookie,
            data=None,
            url="/sys/base/coaaccounterp/page",
            **kwargs):
        """
        查询条件由不定长参数接收.
        在ride使用"xxx"="yyy"的格式传入即可.
        """
        api_name = "基础数据-财务数据-科目体系菜单-科目配置 分页查询"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        # 原始基础条件
        page = kwargs.get('page') if kwargs.get('page') else '1'
        limit = kwargs.get('limit') if kwargs.get('limit') else '20'
        suite = {'page': page, 'limit': limit}
        kwargs.update(suite)
        dlist = []
        for key, value in kwargs.items():
            dlist.append(str(key) + '=' + str(value))
        data = "&".join(dlist)

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data.encode('utf-8'))
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        # print(f"----------> {api_name} 接口响应：{response.text}")
        return response.json()

    def ADD_COA(
            self,
            serverIp,
            cookie,
            accountCode,
            accountName,
            accountSchemeId,
            pid="",
            data=None,
            url="/sys/base/coaaccounterp",
            **kwargs):
        """
        schemeCode：科目编码
        schemeName：科目名称
        accountSchemeId：科目体系的id
        pid：上级科目的id，非必填
        accountType：科目类型
        hierarchy：是否末级，0是，1否
        glflag：与特殊总账业务相关，0是，1否
        specialPurposeId：科目特殊用途的id
        specialPurposeType：科目特殊用途的类型
        specialPurposeTypeName：科目特殊用途的名字
        """
        api_name = "基础数据-财务数据-科目体系菜单-科目配置 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)

        data = {
            "accountCode": accountCode,
            "accountName": accountName,
            "pid": pid,
            "pAccountName": kwargs.get('pAccountName'),
            "accountType": ['D', 'K', 'S', 'A'][random.randint(0, 3)],
            "glFlag": str(random.randint(0, 1)),
            "hierarchy": kwargs.get('hierarchy') or '0',  # 0:末级 才能被用 # str(random.randint(0, 1)),
            "accountSchemeId": accountSchemeId,
            "specialPurposeId": kwargs.get('specialPurposeId'),
            "specialPurposeType": kwargs.get('specialPurposeType'),
            "specialPurposeTypeName": kwargs.get('specialPurposeTypeName'),
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def ADD_EXCHANGERATE(
            self,
            serverIp,
            cookie,
            code, rateSchemeName, basicCurrencyId,
            data=None,
            url="/sys/base/exchangerate",
            **kwargs):
        """
        schemeCode：汇率编码
        schemeName：汇率名称
        accountSchemeId：汇率体系的id
        pid：上级汇率的id，非必填
        accountType：汇率类型
        hierarchy：是否末级，0是，1否
        glflag：与特殊总账业务相关，0是，1否
        specialPurposeId：汇率特殊用途的id
        specialPurposeType：汇率特殊用途的类型
        specialPurposeTypeName：汇率特殊用途的名字
        """
        api_name = "基础数据-财务数据-税率方案 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)

        data = {
            "rateSchemeName_zh-CN": rateSchemeName,
            "rateSchemeName_en-US": kwargs.get("rateSchemeName_en_US"),
            "code": code,
            "basicCurrencyId": basicCurrencyId,
            "currencyName": kwargs.get("currencyName"),
            "exactLength": kwargs.get("exactLength") or "0",
            "ratePeriod": ["EC0001", "EC0002"][random.randint(0, 1)],
            "languages": [
                {
                    "language": "zh-CN",
                    "rateSchemeName": rateSchemeName
                },
                {
                    "language": "en-US",
                    "rateSchemeName": kwargs.get("rateSchemeName_en_US")
                }
            ]
        }
        # print(f"----------> {api_name} 接口请求体：{data}")
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def QUERY_EXCHANGERATE(
            self,
            serverIp,
            cookie,
            data=None,
            url="/sys/base/exchangerate/list",
            **kwargs):
        """
        查询条件由不定长参数接收.
        在ride使用"xxx"="yyy"的格式传入即可.
        """
        api_name = "基础数据-财务数据-税率方案 分页查询"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        # 原始基础条件
        page = kwargs.get('page') if kwargs.get('page') else '1'
        limit = kwargs.get('limit') if kwargs.get('limit') else '20'
        suite = {'page': page, 'limit': limit}
        kwargs.update(suite)
        dlist = []
        for key, value in kwargs.items():
            dlist.append(str(key) + '=' + str(value))
        data = "&".join(dlist)

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data.encode('utf-8'))
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        # print(f"----------> {api_name} 接口响应：{response.text}")
        return self.GET_DICT(response.json(), 'id') or ""

    def ADD_RATECON(
            self,
            serverIp,
            cookie,
            rateSchemeId,
            scalerCurrencyCode="CNY",
            rateValue="0.0001",
            rateMagnification="0",
            rateDate="",
            data=None,
            url="/sys/base/exchangerate/config",
            **kwargs):
        """
        rateSchemeId：汇率方案的id
        rateDate："yyyy-mm-dd"，不传默认取今天
        scalerCurrencyCode：币种编码
        rateValue：汇率
        rateMagnification：放大倍数
        """
        api_name = "基础数据-财务数据-汇率方案菜单-配置 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        try:
            if not isinstance(eval(rateMagnification), int):
                print("rateMagnification放大倍数 请传整数")
                raise BaseException
        except BaseException:
            return
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        if rateDate == "":
            rateDate = datetime.datetime.today().strftime('%Y-%m-%d')  # 取今日日期，格式yyyy-mm-dd
        data = {
            "rateSchemeId": rateSchemeId,
            "rateDate": rateDate,
            "scalerCurrencyCode": scalerCurrencyCode,
            "scalerCurrencyName": kwargs.get("scalerCurrencyName"),
            "rateValue": eval(rateValue),
            "rateMagnification": int(rateMagnification)
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def ADD_SOB(
            self,
            serverIp,
            cookie,
            sobCode,
            sobName,
            coaSchemeId,
            rateSchemeId,
            erpType=None,
            data=None,
            url="/sys/base/sob/",
            **kwargs):
        """
        sobCode：账套编码
        sobName：账套名称
        coaSchemeId：科目体系id
        rateSchemeId：汇率方案id
        useCurrencyCode：可使用币种，如"TWD^CUP"
        erpType：erp类型，如"UFIDA_U8"
        **kwargs支持：expenseAccountId借方科目id、capitalAccountId贷方科目id等
        """
        api_name = "基础数据-财务数据-账套管理 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        erp_list = ['SAP', 'KINGDEE_K3', 'KINGDEE_EAS', 'EBS', 'UFIDA_NC', 'UFIDA_U8']
        data = {
            "sobCode": sobCode,
            "name_zh-CN": sobName,
            "name_en-US": kwargs.get("name_en_US") if kwargs.get("name_en_US") else kwargs.get("name_en-US"),
            "coaSchemeId": coaSchemeId,
            "schemeName": kwargs.get("schemeName") if kwargs.get("schemeName") else "",
            "expenseAccountId": kwargs.get("expenseAccountId") if kwargs.get("expenseAccountId") else "",
            "expenseAccountName": kwargs.get("expenseAccountName") if kwargs.get("expenseAccountName") else "",
            "capitalAccountId": kwargs.get("capitalAccountId") if kwargs.get("capitalAccountId") else "",
            "capitalAccountName": kwargs.get("capitalAccountName") if kwargs.get("capitalAccountName") else "",
            "rateSchemeId": rateSchemeId,
            "rateSchemeName": kwargs.get("rateSchemeName") if kwargs.get("rateSchemeName") else "",
            "useCurrencyCode": kwargs.get("useCurrencyCode"),
            "useCurrencyNames": kwargs.get("useCurrencyNames") if kwargs.get("useCurrencyNames") else "",
            "currencyName": kwargs.get("currencyName") if kwargs.get("currencyName") else "",
            "erpType": erpType if erpType else erp_list[random.randint(0, len(erp_list) - 1)],
            "displayAdjustmentPeriod": kwargs.get("displayAdjustmentPeriod") if kwargs.get(
                "displayAdjustmentPeriod") else "1",
            "remark_zh-CN": kwargs.get("remark_zh_CN") if kwargs.get("remark_zh_CN") else "remark_zh-CN",
            "remark_en-US": kwargs.get("remark_en_US") if kwargs.get("remark_en_US") else kwargs.get("remark_en-US"),
            "currencyCode": kwargs.get("currencyCode"),
            "languages": [{
                "language": "zh-CN",
                "name": sobName,
                "remark": kwargs.get("remark_zh_CN") if kwargs.get("remark_zh_CN") else "remark_zh-CN",
            },
                {
                    "language": "en-US",
                    "name": kwargs.get("name_en_US") if kwargs.get("name_en_US") else kwargs.get(
                        "name_en-US"),
                    "remark": kwargs.get("remark_en_US") if kwargs.get("remark_en_US") else kwargs.get(
                        "remark_en-US"),
                }]
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def QUERY_SOB(
            self,
            serverIp,
            cookie,
            data=None,
            url="/sys/base/sob/page",
            **kwargs):
        """
        查询条件在ride使用"xxx"="yyy"的格式传入即可
        """
        api_name = "基础数据-财务数据-账套管理 分页查询"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        # 原始基础条件
        page = kwargs.get('page') if kwargs.get('page') else '1'
        limit = kwargs.get('limit') if kwargs.get('limit') else '20'
        suite = {'page': page, 'limit': limit}
        kwargs.update(suite)
        dlist = []
        for key, value in kwargs.items():
            dlist.append(str(key) + '=' + str(value))
        data = "&".join(dlist)

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data.encode('utf-8'))
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        # print(f"----------> {api_name} 接口响应：{response.text}")
        return response.json()

    def CREATE_SOBS(self, base_url, cookie, num_sob_makeing=0, namedFlag=''):
        """批量创建多个账套"""
        # 获取币种列表
        msg = ''
        result1 = self.FINDDATA(base_url, cookie,
                                data='page=1&limit=50&orderField=&order=&lovKey=sysCurrencyMode.findNameAndCodeSingle&hasCount=N')
        CURRENCY_CODE_list = self.GET_VALUE_FROM_JSON_DICT(result1, 'CURRENCY_CODE')  # 币种列表
        # 获取汇率方案exchangerate和本位币currencyCode
        concurrent_ = self.FINDDATA(base_url, cookie,
                                    data="page=1&limit=50&orderField=&order=&lovKey=sysExchangeRateMode.findNameAndCode&hasCount=N")
        list_BASIC_CURRENCY_ID = self.GET_VALUE_FROM_JSON_DICT(concurrent_, 'ID')
        list_BASIC_CURRENCY_CODE = self.GET_VALUE_FROM_JSON_DICT(concurrent_, 'BASIC_CURRENCY_CODE')
        ID_CODE_LIST = [list(t) for t in zip(list_BASIC_CURRENCY_ID, list_BASIC_CURRENCY_CODE)]
        # 获取科目体系coaaccountscheme
        result = self.FINDDATA(base_url, cookie,
                               "page=1&limit=1000&orderField=&order=&lovKey=sysCoaAccountSchemeMode.findNameAndCode&hasCount=N")
        list_coaaccountscheme = self.GET_VALUE_FROM_JSON_DICT(result, 'ID')
        sobId_list = []
        for num_v in range(1, num_sob_makeing + 1):
            random_num = f'{random.randint(int(1e+7), int(1e+8))}'  # 随机数8位
            this_code = f"{namedFlag}sob{str(random_num)}"
            this_name = f"{namedFlag}账套名称{str(random_num)}"
            # 挑一个币种
            curr_code = random.choice(CURRENCY_CODE_list)
            # 挑一个汇率方案exchangerate和本位币
            saas = random.choice(ID_CODE_LIST)
            exchangerate = saas[0]  # 汇率方案
            currencyCode = saas[-1]  # 本位币
            # 挑一个科目体系
            coaaccountscheme = random.choice(list_coaaccountscheme)
            if not self.QUERY_COA(base_url, cookie, accountSchemeId=coaaccountscheme).get('page').get('totalCount'):
                this_Coacode = f"{namedFlag}Coa{str(random_num)}"
                this_Coaname = f"{namedFlag}会计科目名称{str(random_num)}"
                self.ADD_COA(base_url, cookie, this_Coacode, this_Coaname, coaaccountscheme)
            num_this = 1
            while True:
                result = self.ADD_SOB(base_url, cookie, this_code, this_name, coaaccountscheme, exchangerate,
                                      currencyCode=currencyCode, useCurrencyCode=curr_code)
                if result.get("msg") == "字段长度超过限制":
                    return "字段长度超出限制，请控制下长度[末尾特征标记]"
                if result.get('msg') == 'success':
                    result23 = self.QUERY_SOB(base_url, cookie, validityFlag='0')
                    sobId = self.GET_DICT(result23, 'id')
                    sobId_list.append(sobId)
                else:
                    if num_this >= 3:
                        msg_ = result.get('msg')
                        if msg_:
                            msg += msg_ + '\n'
                        break
                    else:
                        num_this += 1
                        continue
            if num_this >= 3:
                break
        return sobId_list

    def GET_COAINFO_MUST(self, base_url, cookie, leCode='', coaSchemeId='', num_coa_makeing=1, namedFlag=''):
        """给核算主体编码或者账套id，返回核算主体对应账套对应科目体系下的科目id\name\code"""
        result53 = self.FINDDATA(base_url, cookie,
                                 f'page=1&limit=5&orderField=&order=&CODE={leCode}&lovKey=sysFuLeMode.findNameAndCode&SOB_ID=')
        if not coaSchemeId:
            coaSchemeId = self.GET_DICT(result53, 'COA_SCHEME_ID')
        result032 = self.QUERY_COA(base_url, cookie, accountSchemeId=coaSchemeId)
        if not result032.get('page').get('totalCount'):
            for i in range(num_coa_makeing):
                random_num = f'{random.randint(int(1e+7), int(1e+8))}'  # 随机数8位
                this_Coacode = f"{namedFlag}Coa{str(random_num)}"
                this_Coaname = f"{namedFlag}会计科目名称{str(random_num)}"
                self.ADD_COA(base_url, cookie, this_Coacode, this_Coaname, coaSchemeId)
            result032 = self.QUERY_COA(base_url, cookie, accountSchemeId=coaSchemeId)
        id_list = self.GET_VALUE_FROM_JSON_DICT(result032, 'id')
        name_list = self.GET_VALUE_FROM_JSON_DICT(result032, 'accountName')
        code_list = self.GET_VALUE_FROM_JSON_DICT(result032, 'accountCode')
        # list(zip(id_list, name_list, code_list))
        return list(zip(id_list, name_list, code_list))

    def ADD_FULECC(
            self,
            serverIp,
            cookie,
            code, name_zh_CN, sobId="",
            data=None,
            url="/sys/base/fulecc",
            **kwargs):
        """
        schemeCode：汇率明细编码
        schemeName：汇率明细名称
        accountSchemeId：汇率明细体系的id
        pid：上级汇率明细的id，非必填
        accountType：汇率明细类型
        hierarchy：是否末级，0是，1否
        glflag：与特殊总账业务相关，0是，1否
        specialPurposeId：汇率明细特殊用途的id
        specialPurposeType：汇率明细特殊用途的类型
        specialPurposeTypeName：汇率明细特殊用途的名字
        """
        api_name = "基础数据-财务数据-财务组织 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)

        data = {  # sobName,affiliatedFuleName,validityFlag,closeFlag,pid,fuType,affiliatedFuleId,
            "code": code,
            "name_zh-CN": name_zh_CN,
            "name_en-US": kwargs.get("name_en_US"),
            "sobName": kwargs.get("sobName") or name_zh_CN,
            "legalPerson": kwargs.get("legalPerson"),
            "legalPersonName": kwargs.get("legalPersonName"),
            "taxPayerType": kwargs.get("taxPayerType") or '0',
            "remark_zh-CN": kwargs.get("remark_zh_CN"),
            "remark_en-US": kwargs.get("remark_en_US"),
            "validityFlag": kwargs.get("validityFlag") or '0',
            "fuType": kwargs.get("fuType") or '0',
            "sobId": sobId,
            "affiliatedFuleId": kwargs.get("affiliatedFuleId") or sobId,
            "affiliatedFuleName": kwargs.get("affiliatedFuleName"),
            "closeFlag": kwargs.get("closeFlag") or '0',
            "pid": kwargs.get("pid") or sobId,
            "languages": [
                {
                    "language": "zh-CN",
                    "name": kwargs.get("name_zh_CN") or name_zh_CN,
                    "remark": kwargs.get("remark")
                },
                {
                    "language": "en-US",
                    "name": kwargs.get("name_en_US"),
                    "remark": kwargs.get("remark")
                }
            ]
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def QUERY_FULECC(
            self,
            serverIp,
            cookie,
            data=None,
            url="/sys/base/fulecc/findParentByName",
            **kwargs):
        """
        查询条件由不定长参数接收.
        在ride使用"xxx"="yyy"的格式传入即可.
        """
        api_name = "基础数据-财务数据-财务组织 分页查询"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        if kwargs.get('code'):
            data = {
                "code": kwargs.get('code')
            }
        else:
            data = {
                "name": kwargs.get('name')
            }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        # print(f"----------> {api_name} 接口响应：{response.text}")
        return response.json()

    def BILL_TYPE_INVOICE_TAXRATE(
            self,
            serverIp,
            cookie,
            data=None,
            url="/sys/common/select/list/BILL_TYPE_INVOICE"):
        """
        基础数据-财务数据-税种税率菜单，票据类型查询接口
        data_type:账套名称:0、核算主体:1、业务大类:2，科目名称:3， 或者直接传lovKey的值
        data: 传入其余字段，dict
        """
        api_name = "票据类型 字段查询接口"
        request_url = serverIp + url
        headers = {"Cookie": cookie}
        response = requests.get(
            timeout=timeout,
            url=request_url,
            headers=headers)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def TAX_RATE_TAXRATE(
            self,
            serverIp,
            cookie,
            url="/sys/common/select/list/TAX_RATE"):
        """
        基础数据-财务数据-税种税率菜单，税率(%)查询接口
        data_type:账套名称:0、核算主体:1、业务大类:2，科目名称:3， 或者直接传lovKey的值
        data: 传入其余字段，dict
        """
        api_name = "税率(%) 字段查询接口"
        request_url = serverIp + url
        headers = {"Cookie": cookie}
        response = requests.get(
            timeout=timeout,
            url=request_url,
            headers=headers)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def IS_SPECIAL_TICKET_TAXRATE(
            self,
            serverIp,
            cookie,
            data=None,
            url="/sys/common/select/list/IS_SPECIAL_TICKET"):
        """
        基础数据-财务数据-税种税率菜单，税率(%)查询接口
        data_type:账套名称:0、核算主体:1、业务大类:2，科目名称:3， 或者直接传lovKey的值
        data: 传入其余字段，dict
        """
        api_name = "税率(%) 字段查询接口"
        request_url = serverIp + url
        headers = {"Cookie": cookie}
        response = requests.get(
            timeout=timeout,
            url=request_url,
            headers=headers)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def ADD_TAXRATE(
            self,
            serverIp,
            cookie,
            taxCode,  # 税率编码
            billTypeInvoice,  # 发票类型
            pid,  # 父节点
            taxValue="",
            data=None,
            url="/sys/base/taxrate",
            **kwargs):
        api_name = "基础数据-财务数据-税种税率菜单 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)

        data = {
            "taxCode": taxCode,
            "billTypeInvoice": billTypeInvoice,
            "billTypeInvoiceName": kwargs.get("billTypeInvoiceName"),
            "taxValue": taxValue,
            "isSpecialTicket": str(random.randint(0, 1)),
            "invoiceOperation": str(random.randint(0, 1)),
            "validityFlag": kwargs.get("validityFlag"),
            "taxType": kwargs.get("taxType"),
            "pid": pid,
            "languages": [
                {"language": "zh-CN"},
                {"language": "en-US"}
            ]
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def QUERY_TAXRATE(
            self,
            serverIp,
            cookie,
            taxCode,
            order='asc',
            url="/sys/base/taxrate/sysTaxRateTreeSort",
            **kwargs):
        """
        按编码查询id  order:正序asc，逆序desc
        """
        api_name = "基础数据-财务数据-税种税率菜单 按编码排序"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        data = {
            "order": order,
            "orderField": "taxCode"
        }

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        # print(f"----------> {api_name} 接口响应：{response.text}")
        return self.GET_DICT(response.json(), 'id', taxCode=taxCode)

    def ADD_COMPANYBANK(
            self,
            serverIp,
            cookie,
            fuId, code, subBank, currencyId, sobId, bankAccountNum, bankLevel, bankTypeCode,
            data=None,
            url="/sys/base/companybank",
            **kwargs):
        api_name = "基础数据-财务数据-公司账户 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)

        data = {
            "bankLevel": bankLevel,
            "fuId": fuId,
            "fuLeName": kwargs.get("fuLeName"),
            "code": code,
            "subBank": subBank,
            "subBankName": kwargs.get("subBankName"),
            "bankAccountName": kwargs.get("bankAccountName"),
            "bankAccountNum": bankAccountNum,
            "collectionType": ["RP0001", "RP0002", "RP0003"][random.randint(0, 2)],
            "currencyId": currencyId,
            "currencyName": kwargs.get("currencyName"),
            "bankAccountType": ['AN0001', 'AN0002', 'AN0003'][random.randint(0, 2)],
            "isConnAccount": ['N', 'Y'][random.randint(0, 1)],
            "isConnTicket": ['N', 'Y'][random.randint(0, 1)],
            "sobId": sobId,
            "sobName": kwargs.get("sobName"),
            "bankTypeCode": bankTypeCode
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def ADD_PAYMENTMODE(
            self,
            serverIp,
            cookie,
            paymentSort, paymentCode, paymentName_zh_CN,
            data=None,
            url="/sys/base/paymentmode",
            **kwargs):
        api_name = "基础数据-财务数据-结算方式 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)

        data = {
            "paymentSort": paymentSort,
            "paymentCode": paymentCode,
            "paymentName_zh-CN": paymentName_zh_CN,
            "paymentName_en-US": paymentName_zh_CN,
            "onAccountFlag": str(random.randint(0, 1)),
            "transferFundFlag": ['001', '002', '003', '004', '005', '007', '008'][random.randint(0, 6)],
            "bankAccountFlag": str(random.randint(0, 1)),
            "languages": [
                {
                    "language": "zh-CN",
                    "paymentName": paymentName_zh_CN
                },
                {
                    "language": "en-US",
                    "paymentName": paymentName_zh_CN
                }
            ]
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def QUERY_PAYMENTMODE(
            self,
            serverIp,
            cookie,
            data=None,
            url="/sys/base/paymentmode/list",
            **kwargs):
        """
        查询条件在ride使用"xxx"="yyy"的格式传入即可
        """
        api_name = "基础数据-财务数据-结算方式 分页查询"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        # 原始基础条件
        page = kwargs.get('page') if kwargs.get('page') else '1'
        limit = kwargs.get('limit') if kwargs.get('limit') else '50'
        suite = {'page': page, 'limit': limit}
        kwargs.update(suite)
        dlist = []
        for key, value in kwargs.items():
            dlist.append(str(key) + '=' + str(value))
        data = "&".join(dlist)

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data.encode('utf-8'))
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        # print(f"----------> {api_name} 接口响应：{response.text}")
        return response.json()

    def ADD_CATEGORY(
            self,
            serverIp,
            cookie,
            code,
            name_zh_CN,
            pid='0',
            url="/sys/base/boe/base",
            *args,
            **kwargs):
        """
        新增业务大/小类
        :param serverIp: IP地址
        :param cookie: cookie信息
        :param code: 业务类型编码
        :param name_zh_CN: 业务类型名称
        :param pid: 业务大类pid
        :param protocol: 协议，默认为http
        :param port: 端口号，默认为空
        :param url: 接口地址，默认为/sys/base/boe/base
        :param args: 不定长参数
        :param kwargs: 关键字参数
        :return: response.json()
        """
        request_url = serverIp + url
        headers = {
            "Content-Type": "application/json",
            "Cookie": cookie
        }
        data = {
            "code": code,
            "name_zh-CN": name_zh_CN,
            "name_en-US": kwargs.get("name_en-US") or kwargs.get("name_en_US"),
            "icon": kwargs.get("icon"),
            "appShow": kwargs.get("appShow"),
            "appName_zh-CN": kwargs.get("appName_zh-CN") or kwargs.get("appName_zh_CN"),
            "appName_en-US": kwargs.get("appName_en-US") or kwargs.get("appName_zh_US"),
            "validityFlag": kwargs.get("validityFlag") or "0",
            "auditPoints_zh-CN": kwargs.get("auditPoints_zh-CN") or kwargs.get("auditPoints_zh_CN"),
            "auditPoints_en-US": kwargs.get("auditPoints_en-US") or kwargs.get("auditPoints_en_US"),
            "remark_zh-CN": kwargs.get("remark_zh-CN") or kwargs.get("remark_zh_CN"),
            "remark_en-US": kwargs.get("remark_en-US") or kwargs.get("remark_en_US"),
            "attribute": kwargs.get("attribute"),
            "statisticalDimensionId": kwargs.get("statisticalDimensionId"),
            "type": kwargs.get("type") or "0",
            "pid": pid,
            "languages": [{
                "language": "zh-CN",
                "name": name_zh_CN,
                "appName": kwargs.get("appName_zh-CN") or kwargs.get("appName_zh_CN"),
                "auditPoints": kwargs.get("auditPoints_zh-CN") or kwargs.get("auditPoints_zh_CN"),
                "remark": kwargs.get("remark_zh-CN") or kwargs.get("remark_zh_CN")
            },
                {
                    "language": "en-US",
                    "name": kwargs.get("name_en-US") or kwargs.get("name_en_US"),
                    "appName": kwargs.get("appName_en-US") or kwargs.get("appName_zh_US"),
                    "auditPoints": kwargs.get("auditPoints_en-US") or kwargs.get("auditPoints_en_US"),
                    "remark": kwargs.get("remark_en-US") or kwargs.get("remark_en_US")
                }]
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=json.dumps(data))
        # print(f"----------> 新增业务大/小类响应：{response.json()}")
        assert response.status_code == 200, "{} 接口响应状态码不是200".format(
            self.__doc__.split("\n")[1].strip("\t"))
        return response.json()

    def ADD_BIZ2ACCOUNT(
            self,
            serverIp,
            cookie,
            sob_list,  # sobId, coaSchemeId
            bizCategoryId_list,  # bizCategoryId
            accountType_list,  # accountType
            goal,
            data=None,
            url="/sys/base/bizaccountsubject",
            **kwargs):
        api_name = "基础配置-核算基础-会计科目配置菜单-业务科目配置 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        times = 0
        for x in sob_list:
            sobId, coaSchemeId = x[0], x[1]
            for accountType in accountType_list:
                for bizCategoryId in bizCategoryId_list:
                    if data:
                        if isinstance(data, str):
                            kwargs.update(eval(data))
                        if isinstance(data, dict):
                            kwargs.update(data)
                    result2 = self.QUERY_COA(serverIp, cookie, accountSchemeId=coaSchemeId)
                    accountId = self.GET_DICT(result2, 'id')
                    accountCode = self.GET_DICT(result2, 'accountCode')
                    # accountType = self.GET_DICT(result2, 'accountType')
                    data = {
                        "sobId": sobId,
                        "sobName": kwargs.get("sobName"),
                        "fuId": kwargs.get("fuId"),
                        "fuName": kwargs.get("fuName"),
                        "bizCategoryId": bizCategoryId,
                        "bizCategoryName": kwargs.get("bizCategoryName"),
                        "accountType": accountType,
                        "accountId": accountId,
                        "accountName": kwargs.get("accountName"),
                        "funRangeType": kwargs.get("funRangeType"),
                        "projectCode": kwargs.get("projectCode"),
                        "coaSchemeId": coaSchemeId,
                        "accountCode": accountCode
                    }
                    response = requests.post(
                        timeout=timeout,
                        url=request_url,
                        headers=headers,
                        json=data)
                    # print(f"----------> {api_name} 接口响应：{response.text}")
                    assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
                    times += 1
                    # list_base_num_more[0] += 1
                    utils.set_cache(serverIp, kwargs.get('user_addr'), "业务科目配置")

                    if times >= goal:
                        return f'造数完成，造数{times}次'
        return f'造数失败，造数{times}次'

    def ADD_TAXRATEC(
            self,
            serverIp,
            cookie,
            sob_list,  # sobId, coaSchemeId
            taxRateId_list,  # taxRateId税种税率
            accountType_list,  # accountType
            goal,
            data=None,
            url="/sys/base/taxRateC",
            **kwargs):
        api_name = "基础配置-核算基础-会计科目配置菜单-税务科目配置 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        times = 0
        for x in sob_list:
            sobId, coaSchemeId = x[0], x[1]
            for accountType in accountType_list:
                for taxRateId in taxRateId_list:
                    if data:
                        if isinstance(data, str):
                            kwargs.update(eval(data))
                        if isinstance(data, dict):
                            kwargs.update(data)
                    result2 = self.QUERY_COA(serverIp, cookie, accountSchemeId=coaSchemeId)
                    accountId = self.GET_DICT(result2, 'id')
                    accountCode = self.GET_DICT(result2, 'accountCode')

                    data = {
                        "sobId": sobId,
                        "sobName": kwargs.get("sobName"),
                        "deptId": kwargs.get("deptId"),
                        "fuName": kwargs.get("fuName"),
                        "taxRateId": taxRateId,
                        "taxRateName": kwargs.get("taxRateName"),
                        "accountId": accountId,
                        "accountName": kwargs.get("accountName"),
                        "taxItemCode": kwargs.get("taxItemCode"),
                        "accountType": accountType,
                        "coaSchemeId": coaSchemeId,
                        "accountCode": accountCode
                    }
                    response = requests.post(
                        timeout=timeout,
                        url=request_url,
                        headers=headers,
                        json=data)
                    # print(f"----------> {api_name} 接口响应：{response.text}")
                    assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
                    times += 1
                    utils.set_cache(serverIp, kwargs.get('user_addr'), "税务科目配置")
                    # list_base_num_more[1] += 1
                    if times >= goal:
                        return f'造数完成，造数{times}次'
        return f'造数失败，造数{times}次'

    def ADD_PAYMODEACCT(
            self,
            serverIp,
            cookie,
            sob_list,  # sobId, coaSchemeId
            payment_list,  # paymentModeId,TRANSFER_FUND_FLAG
            goal,
            data=None,
            url="/sys/base/paymentmodeaccount",
            **kwargs):
        api_name = "基础配置-核算基础-会计科目配置菜单-结算科目配置 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        times = 0
        for x in sob_list:
            sobId, coaSchemeId = x[0], x[1]
            for y in payment_list:
                paymentModeId, transferFundFlag = y[0], y[1]
                if data:
                    if isinstance(data, str):
                        kwargs.update(eval(data))
                    if isinstance(data, dict):
                        kwargs.update(data)
                result2 = self.QUERY_COA(serverIp, cookie, accountSchemeId=coaSchemeId)
                subjectId = self.GET_DICT(result2, 'id')
                accountCode = self.GET_DICT(result2, 'accountCode')
                data = {
                    "sobId": sobId,
                    "sobName": kwargs.get("sobName"),
                    "fuId": kwargs.get("fuId"),
                    "leName": kwargs.get("leName"),
                    "paymentModeId": paymentModeId,
                    "paymentModeName": kwargs.get("paymentModeName"),
                    "subjectId": subjectId,
                    "accountName": kwargs.get("accountName"),
                    "coaSchemeId": coaSchemeId,
                    "accountCode": accountCode,
                    "transferFundFlag": transferFundFlag
                }
                response = requests.post(
                    timeout=timeout,
                    url=request_url,
                    headers=headers,
                    json=data)
                # print(f"----------> {api_name} 接口响应：{response.text}")
                assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
                times += 1
                # list_base_num_more[2] += 1
                utils.set_cache(serverIp, kwargs.get('user_addr'), "结算科目配置")

                if times >= goal:
                    return f'造数完成，造数{times}次'
        return f'造数失败，造数{times}次'

    def QUERY_CATEGORY_TREE(
            self,
            serverIp,
            cookie,
            url="/sys/base/boe/base/categoryTree",
            **kwargs):
        api_name = "查询业务类型树"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json={})
        # print(f"----------> {api_name} 接口响l")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def QUERY_BIZ_ACCOUNT_TYPE(
            self,
            serverIp,
            cookie,
            url="/sys/common/select/list/BIZ_ACCOUNT_TYPE",
            **kwargs):
        api_name = "查业务科目类型"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie
        }

        response = requests.get(
            timeout=timeout,
            url=request_url,
            headers=headers)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def QUERY_TAXRATE_TREE(
            self,
            serverIp,
            cookie,
            url="/sys/base/taxrate/sysTaxRateTreeSort",
            **kwargs):
        api_name = "查询业务类型树"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json={"validityFlag": "0"})
        # print(f"----------> {api_name} 接口响l")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def ADD_COMP2BANK(
            self,
            serverIp,
            cookie,
            companyBankId,
            bankAccountNum,
            leId,
            coaSchemeId,
            data=None,
            url="/sys/base/companybankaccount",
            **kwargs):
        api_name = "基础配置-核算基础-会计科目配置菜单-银行&票据科目配置 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)

        data = {
            "companyBankId": companyBankId,
            "bankAccountName": kwargs.get("bankAccountName"),
            "accountId": kwargs.get("accountId"),
            "accountName": kwargs.get("accountName"),
            "ticketId": kwargs.get("ticketId"),
            "ticketName": kwargs.get("ticketName"),
            "bankAccountNum": bankAccountNum,
            "leId": leId,
            "coaSchemeId": coaSchemeId,
            "accountCode": kwargs.get("accountCode"),
            "ticketCode": kwargs.get("ticketCode")
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def QUERY_COMPANYBANK(
            self,
            serverIp,
            cookie,
            data=None,
            url="/sys/base/companybank/page",
            **kwargs):
        """
        查询条件在ride使用"xxx"="yyy"的格式传入即可
        """
        api_name = "基础数据-财务数据-公司账户 分页查询"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        # 原始基础条件
        page = kwargs.get('page') if kwargs.get('page') else '1'
        limit = kwargs.get('limit') if kwargs.get('limit') else '20'
        suite = {'page': page, 'limit': limit}
        kwargs.update(suite)
        dlist = []
        for key, value in kwargs.items():
            dlist.append(str(key) + '=' + str(value))
        data = "&".join(dlist)

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data.encode('utf-8'))
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        # print(f"----------> {api_name} 接口响应：{response.text}")
        return response.json()

    def ADD_ACCOUNTSTRUCTURES(
            self,
            serverIp,
            cookie,
            structureCode,
            structureName,
            data=None,
            url="/sys/base/accountstructures",
            *args,
            **kwargs):
        """
        基础配置-核算基础-凭证配置-会计结构建立 新增会计结构(基本信息)
        \n:param structureCode: 编码
        \n:param structureName: 名称

        如果要传入其他参数，请参照下列示例：
                分隔符：delimiter=D001  枚举值：{'D001': '-'}
        """
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        if data:
            kwargs.update(eval(data))
        namedFlag = kwargs.get("namedFlag")
        random_num = self.random_character(char_type="str", length="8")
        this_code = f"{namedFlag}jgxx{str(random_num)}"
        this_name = f"{namedFlag}结构信息{str(random_num)}"
        result23 = self.FINDDATA(serverIp, cookie, 'page=1&limit=5&orderField=&order=&lovKey=sysAccountStructures.'
                                                   'findFlexvaluesets&DIMENSION_PURPOSE_MULTI=STRUCTURES&VALIDITY_FLAG=0&hasCount=N')
        flexValueSetsId = random.choice(self.GET_VALUE_FROM_JSON_DICT(result23, 'ID'))
        data = {
            "structureCode": structureCode,
            "structureName": structureName,
            "delimiter": kwargs.get("delimiter"),
            "sysAccountStructuresDetailDTOS": [
                {
                    # detailCode, detailName, flexValueSetsId, flexValueSetsName 一起填
                    "detailCode": this_code,
                    "detailName": this_name,
                    "flexValueSetsId": flexValueSetsId,
                    "flexValueSetsName": kwargs.get("flexValueSetsName"),
                    "defaultCode": kwargs.get("defaultCode"),
                    "dSql": kwargs.get("dSql"),
                    "defaultName": kwargs.get("defaultName"),
                    "cSql": kwargs.get("cSql")
                }
            ]
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=json.dumps(data))
        # print(f"----------> 基础配置-核算基础-凭证配置-会计结构建立 新增会计结构 接口响应：{response.text}")
        assert response.status_code == 200, "{} 接口响应状态码不是200".format(
            self.__doc__.split("\n")[1].strip("\t"))
        return response.json()

    def LINK_SOB_SECONDARYSEGMENT(
            self,
            serverIp,
            cookie,
            sobId, secondarySegment: str,
            data=None,
            url="/sys/base/sob/secondarySegment",
            **kwargs):
        """
        基础配置-核算基础-凭证配置-会计结构建立 关联适用账套
        sobId多个时传列表格式，一个时字符串即可
        """
        api_name = "基础配置-核算基础-凭证配置-会计结构建立 关联适用账套"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        if isinstance(sobId, list):
            sobId = '^'.join(sobId)
        data = f'sobId={sobId}&secondarySegment={secondarySegment}'
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data.encode('utf-8'))
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        # print(f"----------> {api_name} 接口响应：{response.text}")
        return response.json()

    def ADD_STRUCTURESGROUP(
            self,
            serverIp,
            cookie,
            sobId, structureGroupName, structureGroupCode,
            data=None,
            url="/sys/base/structuresgroup",
            **kwargs):
        api_name = "基础配置-核算基础-凭证配置-辅助核算建立 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)

        data = {
            "sobId": sobId,
            "sobName": kwargs.get("sobName"),
            "structureGroupName": structureGroupName,
            "structureGroupCode": structureGroupCode
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def QUERY_STRUCTURESGROUP(
            self,
            serverIp,
            cookie,
            data=None,
            url="/sys/base/structuresgroup/list",
            **kwargs):
        """
        查询条件在ride使用"xxx"="yyy"的格式传入即可
        """
        api_name = "基础配置-核算基础-凭证配置-辅助核算建立 分页查询"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        # 原始基础条件
        page = kwargs.get('page') if kwargs.get('page') else '1'
        limit = kwargs.get('limit') if kwargs.get('limit') else '20'
        suite = {'page': page, 'limit': limit}
        kwargs.update(suite)
        dlist = []
        for key, value in kwargs.items():
            dlist.append(str(key) + '=' + str(value))
        data = "&".join(dlist)

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data.encode('utf-8'))
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        # print(f"----------> {api_name} 接口响应：{response.text}")
        return response.json()

    def ADD_STRUCTCONF(
            self,
            serverIp,
            cookie,
            id, ids,
            data=None,
            url="/sys/base/structuresgroup/config",
            **kwargs):
        # id：辅助核算id
        # ids:核算组合id,多个id用^连接ids: id1^id2，或list
        api_name = "基础配置-核算基础-凭证配置-辅助核算建立-配置 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        if isinstance(ids, list):
            ids = '^'.join(ids)
        data = {
            "id": id,
            "ids": ids
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def ADD_SPECIALGLTYPE(
            self,
            serverIp,
            cookie,
            sobId, sobCode, accountType, glCode, glName,
            data=None,
            url="/sys/base/specialgltype",
            **kwargs):

        api_name = "基础配置-核算基础-SPA相关配置-特殊总账类型 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)

        data = {
            "sobCode": sobCode,
            "sobName": kwargs.get("sobName"),
            "accountType": accountType,
            "glCode": glCode,
            "glName": glName,
            "sobId": sobId
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def QUERY_SPECIALGLTYPE(
            self,
            serverIp,
            cookie,
            data=None,
            url="/sys/base/specialgltype/page",
            **kwargs):
        """
        查询条件在ride使用"xxx"="yyy"的格式传入即可
        """
        api_name = "基础配置-核算基础-SPA相关配置-特殊总账类型 分页查询"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        # 原始基础条件
        page = kwargs.get('page') if kwargs.get('page') else '1'
        limit = kwargs.get('limit') if kwargs.get('limit') else '20'
        suite = {'page': page, 'limit': limit}
        kwargs.update(suite)
        dlist = []
        for key, value in kwargs.items():
            dlist.append(key + '=' + value)
        data = "&".join(dlist)

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data.encode('utf-8'))
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        # print(f"----------> {api_name} 接口响应：{response.text}")
        return response.json()

    def ADD_SAPSGL(
            self,
            serverIp,
            cookie,
            sobCode, coaAccountType, sgl, controlAccountId, targetAccountId, coaSchemeId,
            data=None,
            url="/sys/base/sapsgl",
            **kwargs):
        api_name = "基础配置-核算基础-SPA相关配置-特殊总账标识 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)

        data = {
            "sobCode": sobCode,
            "sobName": kwargs.get("sobName"),
            "coaAccountType": coaAccountType,
            "sgl": sgl,
            "sglName": kwargs.get("sglName"),
            "controlAccountId": controlAccountId,
            "controlAccountName": kwargs.get("controlAccountName"),
            "targetAccountId": targetAccountId,
            "targetAccountName": kwargs.get("targetAccountName"),
            "validityFlag": kwargs.get("validityFlag"),
            "coaSchemeId": coaSchemeId,
            "coaSchemeName": kwargs.get("coaSchemeName")
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def ADD_POSTINGKEY(
            self,
            serverIp,
            cookie,
            sobId, sobCode, sobName,
            data=None,
            url="/sys/base/postingkey",
            **kwargs):
        api_name = "基础配置-核算基础-SPA相关配置-记账代码 新增"
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json;charset=UTF-8"
        }
        if data:
            if isinstance(data, str):
                kwargs.update(eval(data))
            if isinstance(data, dict):
                kwargs.update(data)
        data = {
            "sobId": sobId,
            "sobCode": sobCode,
            "sobName": sobName,
            "postingKeyCode": kwargs.get("postingKeyCode"),
            "postingKeyName": kwargs.get("postingKeyName"),
            "debitLenderCode": random.choice(['DEBIT', 'CREDIT']),
            "accountType": random.choice(['A', 'D', 'K', 'S']),
            "glFlag": random.choice(['0', '1'])
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        # print(f"----------> {api_name} 接口响应：{response.text}")
        assert response.status_code == 200, f"{api_name} 接口断言失败，接口响应：{response.json()}"
        return response.json()

    def QUERY_FMC_TEMPLATE_CATEGORY(
            self,
            serverIp,
            cookie,
            url="/sys/fmc/fmcnewcategory/tree",
            **kwargs):

        """
        添加流程模板
        在ride使用"xxx"="yyy"的格式传入即可.
        """
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        data = {
            "fromSystem": "ECS"
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        assert response.status_code == 200
        return response.json()

    def QUERY_FMC_TEMPLATE_COMPANY(
            self,
            serverIp,
            cookie,
            url="/sys/common/dept/findChildrenByIdAndValidity",
            **kwargs):
        """
        查询流程模板所属公司
        在ride使用"xxx"="yyy"的格式传入即可.
        """
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        data = {
            "pid": kwargs.get("pid", "0"),
            "validityFlag": "0",
            "org": "4^0"
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        assert response.status_code == 200
        return response.json()

    def ADD_FMC_TEMPLATE(
            self,
            serverIp,
            cookie,
            url="/sys/fmc/fmctemplate/add",
            **kwargs):
        """
        添加流程模板
        在ride使用"xxx"="yyy"的格式传入即可.
        """
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        data = {
            "templateCode": kwargs.get("templateCode"),
            "templateName": kwargs.get("templateName"),
            "categoryId": kwargs.get("categoryId"),
            "companyId": kwargs.get("companyId"),
            "fromSystem": "ECS"
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data)
        assert response.status_code == 200
        # print(f"----------> {api_name} 接口响应：{response.text}")
        return response.json()

    def DEPLOY_FMC_TEMPLATE(
            self,
            serverIp,
            cookie,
            url="/fmc/uflo/designer/deploy",
            **kwargs):
        """
        发布流程模板
        在ride使用"xxx"="yyy"的格式传入即可.
        """

        templateName = kwargs.get("templateName")
        categoryId = kwargs.get("categoryId")
        content = f'''<?xml version="1.0" encoding="utf-8"?><uflo-process name="{templateName}" category-id="{categoryId}"><start name="开始" x="{random.randint(100, 1500)}" y="{random.randint(100, 500)}" width="40" height="70" ><sequence-flow g="" type="line" to="预算冻结"></sequence-flow></start><end name="结束流程" x="{random.randint(100, 1500)}" y="{random.randint(100, 500)}" width="40" height="70"  terminate="true"></end><task name="业务审批" x="{random.randint(100, 1500)}" y="{random.randint(100, 500)}" width="40" height="70"  task-type="Normal" assignment-type="Handler" assignment-handler-bean="部门负责人(按岗位)" allow-specify-assignee="false"><user-data value="YWSP" key="BUSS_FLAG^业务审批"/><sequence-flow g="" type="line" to="共享审批"></sequence-flow></task><task name="共享审批" x="{random.randint(100, 1500)}" y="{random.randint(100, 500)}" width="40" height="70"  task-type="Normal" assignment-type="Assignee" allow-specify-assignee="false"><assignee provider-id="user" id="FSSC" name="财务审批" type="approver" ></assignee><user-data value="FSSC" key="FSSC_FLAG^共享中心审批"/><sequence-flow g="" type="line" to="结束流程"></sequence-flow></task><action name="预算冻结" x="{random.randint(100, 1500)}" y="{random.randint(100, 500)}" width="40" height="70"  handler-bean="预算冻结" ><sequence-flow g="" type="line" to="业务审批"></sequence-flow></action></uflo-process>'''

        def save_file(
                url="/fmc/uflo/designer/saveFile"):
            request_url = serverIp + url
            headers = {
                "Cookie": cookie,
                "Content-Type": "application/x-www-form-urlencoded"
            }
            data = {
                "fileName": f"file:{templateName}.uflo.xml",
                "content": content
            }
            response = requests.post(
                timeout=timeout,
                url=request_url,
                headers=headers,
                data=data)
            assert response.status_code == 200
            return SAVE_FMC_TEMPLATE()

        def SAVE_FMC_TEMPLATE(
                url="/fmc/processExtend/saveFmcWfProcessExtend"):
            """
            保存流程模板
            在ride使用"xxx"="yyy"的格式传入即可.
            """
            request_url = serverIp + url
            headers = {
                "Cookie": cookie,
                "Content-Type": "application/json"
            }
            data = {
                "fileContent": content,
                "filename": f"{templateName}.uflo.xml",
                "classifyId": categoryId,
                "theirSysId": None
            }
            response = requests.post(
                timeout=timeout,
                url=request_url,
                headers=headers,
                json=data)
            assert response.status_code == 200
            return deploy()

        def SAVE_FMC_TEMPLATE2(
                processId,
                url="/fmc/processExtend/saveFmcWfProcessExtend"):
            """
            保存流程模板
            在ride使用"xxx"="yyy"的格式传入即可.
            """
            request_url = serverIp + url
            headers = {
                "Cookie": cookie,
                "Content-Type": "application/json"
            }
            data = {
                "fileContent": content,
                "filename": f"{templateName}.uflo.xml",
                "classifyId": categoryId,
                "processId": processId,
                "theirSysId": None,
                "isCheckFlag": False
            }
            response = requests.post(
                timeout=timeout,
                url=request_url,
                headers=headers,
                json=data)
            assert response.status_code == 200
            return response.text

        def deploy():
            request_url = serverIp + url
            headers = {
                "Cookie": cookie,
                "Content-Type": "application/x-www-form-urlencoded"
            }
            data = {
                "content": content
            }
            response = requests.post(
                timeout=timeout,
                url=request_url,
                headers=headers,
                data=data)
            assert response.status_code == 200
            return SAVE_FMC_TEMPLATE2(response.text)

        return deploy()

    def QUERY_BOE_TEMPLATE(
            self,
            serverIp,
            cookie,
            url="/sys/base/boetype/page",
            **kwargs):
        """
        查询单据模板
        """
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        data = {
            "page": 1,
            "limit": 100,
            "isBoeTemplate": 0,
            "groupId": "GP00",
            "validityFlag": 0
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data)
        assert response.status_code == 200
        return response.json()

    def ADD_BOE_TEMPLATE(
            self,
            serverIp,
            cookie,
            url="/sys/base/boetype",
            **kwargs):
        """
        查询单据模板
        """
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        data = {
            "boeTypeName_zh-CN": kwargs.get("boeTemplateName"),
            "boeTypeName_en-US": kwargs.get("boeTemplateName"),
            "boeTypeCode": kwargs.get("boeTemplateCode"),
            "boeCode": kwargs.get("boeCode"),
            "boeTemplateId": kwargs.get("boeTemplateId"),
            "boeTemplateName": kwargs.get("boeTypeName"),
            "boeTemplateCode": kwargs.get("boeTypeCode"),
            "boeClassify": kwargs.get("boeClassify"),
            "serviceName": kwargs.get("serviceName"),
            "voucherServiceName": kwargs.get("voucherServiceName"),
            "budgetFlag": kwargs.get("budgetFlag"),
            "standardFlag": kwargs.get("standardFlag"),
            "payFlag": kwargs.get("payFlag"),
            "appSubmit": kwargs.get("appSubmit"),
            "isGenVoucher": kwargs.get("isGenVoucher"),
            "isStatistics": kwargs.get("isStatistics"),
            "enableImageArea": kwargs.get("enableImageArea") if kwargs.get("enableImageArea") else "N",
            "isEnableOcr": kwargs.get("isEnableOcr") if kwargs.get("isEnableOcr") else "N",
            "remark_zh-CN": kwargs.get("remark"),
            "remark_en-US": kwargs.get("remark"),
            "auditFlag": kwargs.get("auditFlag"),
            "version": kwargs.get("version"),
            "boeCategory": kwargs.get("boeCategory"),
            "languages": [
                {
                    "language": "zh-CN",
                    "boeTypeName": kwargs.get("boeTemplateName"),
                    "remark": kwargs.get("remark")
                },
                {
                    "language": "en-US",
                    "boeTypeName": kwargs.get("boeTemplateName"),
                    "remark": kwargs.get("remark")
                }
            ],
            "isBoeTemplate": "1",
            "fromSystem": kwargs.get("fromSystem")
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        assert response.status_code == 200
        return response.json()

    def DEPLOY_BOE_TEMPLATE(
            self,
            serverIp,
            cookie,
            url="/sys/base/boetype",
            **kwargs):
        """
        发布单据模板
        """

        def query_boe_template_list(url="/sys/base/boetype/page"):
            request_url = serverIp + url
            headers = {
                "Cookie": cookie,
                "Content-Type": "application/x-www-form-urlencoded"
            }
            data = {
                "page": 1,
                "limit": 10,
                "boeTypeCode": kwargs.get("boeTemplateCode"),
                "isBoeTemplate": 1
            }
            response = requests.post(
                timeout=timeout,
                url=request_url,
                headers=headers,
                data=data)
            assert response.status_code == 200
            result = random.choice(response.json().get("page").get("list"))
            global templateId
            templateId = result.get("id")
            return query_boe_template_fields_detail(id=templateId,
                                                    boeCategory=result.get("boeCategory"),
                                                    boeTemplateId=result.get("boeTemplateId"))

        def query_boe_template_fields_detail(url="/sys/base/boepage/list", **kwa):
            request_url = serverIp + url
            headers = {
                "Cookie": cookie,
                "Content-Type": "application/json"
            }
            data = {
                "id": kwa.get("id"),
                "boeCategory": kwa.get("boeCategory"),
                "boeTemplateId": kwa.get("boeTemplateId")
            }
            response = requests.post(
                timeout=timeout,
                url=request_url,
                headers=headers,
                json=data)
            assert response.status_code == 200
            result = response.json().get("dto")
            return deploy(data1=result)

        def deploy(data1):
            request_url = serverIp + url
            headers = {
                "Cookie": cookie,
                "Content-Type": "application/json"
            }
            boeTypeId = data1.get("boeTypeId")
            data = {
                "boePageFormDTOList": data1.get("boePageTemplateDTOList"),
                "boeTypeId": boeTypeId
            }
            response = requests.post(
                timeout=timeout,
                url=request_url,
                headers=headers,
                json=data)
            assert response.status_code == 200
            assert response.json().get("msg") == "success"
            return save_template(boeTypeId=boeTypeId)

        def save_template(url="/sys/base/boepagetemplate/saveTemplate", boeTypeId=None):
            request_url = serverIp + url
            headers = {
                "Cookie": cookie,
                "Content-Type": "application/json"
            }
            data = {
                "boeTypeId": boeTypeId,
                "template": "[]"
            }
            response = requests.post(
                timeout=timeout,
                url=request_url,
                headers=headers,
                json=data)
            assert response.status_code == 200
            return response.json()

        return query_boe_template_list(), templateId

    def CONFIG_BOE_TEMPLATE_CATEGORY(
            self,
            serverIp,
            cookie,
            url="/sys/base/boetype/saveBizIncr",
            **kwargs):
        """
        单据配置-配置业务类型
        """

        # 查询可选业务类型
        data = {
            "page": 1,
            "limit": 20,
            "lovKey": "sysTravelSchemeMode.findBizCategory",
            "hasCount": "N"
        }
        result = self.FINDDATA(serverIp, cookie, data=data)
        categoryId = random.choice(result.get("page").get("list")).get("ID")

        # 配置业务类型
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        data = {
            "bizCategoryId": "",
            "bizCategoryIdCk": categoryId,
            "id": kwargs.get("boeTemplateId")
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        assert response.status_code == 200
        return response.json()

    def CONFIG_BOE_TEMPLATE_FMC(
            self,
            serverIp,
            cookie,
            url="/sys/base/processallocation",
            **kwargs):
        """
        单据配置-配置流程模板引用
        """

        def query_fmc_template(url="/sys/base/bizboetyper/templatePage"):
            request_url = serverIp + url
            headers = {
                "Cookie": cookie,
                "Content-Type": "application/x-www-form-urlencoded"
            }
            data = {
                "page": 1,
                "limit": 20,
                "hasCount": "N",
                "fromSystem": "ECS"
            }
            response = requests.post(
                timeout=timeout,
                url=request_url,
                headers=headers,
                data=data)
            assert response.status_code == 200
            return response.json()

        def query_category(url="/sys/base/boetype/getBizCategoryPage"):
            request_url = serverIp + url
            headers = {
                "Cookie": cookie,
                "Content-Type": "application/x-www-form-urlencoded"
            }
            data = {
                "page": 1,
                "limit": 20,
                "boeTypeId": kwargs.get("boeTypeId"),
                "hasCount": "N"
            }
            response = requests.post(
                timeout=timeout,
                url=request_url,
                headers=headers,
                data=data)
            assert response.status_code == 200
            return response.json()

        def query_dept(url="/sys/common/dept/findChildrenByIdAndValidity"):
            request_url = serverIp + url
            headers = {
                "Cookie": cookie,
                "Content-Type": "application/json"
            }
            data = {
                "pid": "0",
                "validityFlag": "0",
                "org": "4^0^1"
            }
            response = requests.post(
                timeout=timeout,
                url=request_url,
                headers=headers,
                json=data)
            assert response.status_code == 200
            return response.json()

        r = query_fmc_template()
        fmcTemplateData = random.choice(r.get("page").get("list"))
        r = query_category()
        categoryData = random.choice(r.get("page").get("list"))
        r = query_dept()
        orgData = random.choice(r.get("tree"))

        # 新增流程引用
        data = {
            "fmcTemplate": fmcTemplateData.get("FMCTEMPLATE"),
            "bizCategoryId": categoryData.get("bizId"),
            "bizCategoryName": categoryData.get("name"),
            "orgId": orgData.get("obj").get("id"),
            "orgName": orgData.get("obj").get("name"),
            "boeTypeId": categoryData.get("boeId"),
            "fromSystem": kwargs.get("fromSystem")
        }

        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        assert response.status_code == 200
        return response.json()

    def CONFIG_BOE_TEMPLATE_ACCOUNT(
            self,
            serverIp,
            cookie,
            url="/sys/base/companybankbatch",
            **kwargs):
        """
        单据配置-配置账户分配
        """

        def query_account(url="/sys/base/companybank/page"):
            request_url = serverIp + url
            headers = {
                "Cookie": cookie,
                "Content-Type": "application/x-www-form-urlencoded"
            }
            data = {
                "page": 1,
                "limit": 20,
                "hasCount": "N",
                "validityFlag": 0
            }
            response = requests.post(
                timeout=timeout,
                url=request_url,
                headers=headers,
                data=data)
            assert response.status_code == 200
            return response.json()

        # 查账户名称
        r = query_account()
        accountData = random.choice(r.get("page").get("list"))
        # 查适用核算主体
        data = {
            "page": 1,
            "limit": 20,
            "lovKey": "sysFuLeMode.findNameAndCodeToCompanyMan",
            "hasCount": "N"
        }
        r = self.FINDDATA(serverIp, cookie, data=data)
        leData = random.choice(r.get("page").get("list"))
        # 新增账户分配
        data = {
            "companyBankId": accountData.get("id"),
            "bankAccountName": accountData.get("bankAccountName"),
            "fuId": leData.get("ID"),
            "fuName": leData.get("NAME"),
            "bizId": "",
            "bizName": "",
            "inMoneyType": "",
            "boeTypeId": kwargs.get("boeTypeId")
        }
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        assert response.status_code == 200
        return response.json()

    def CONFIG_BOE_TEMPLATE_PAYMENT_METHODS(
            self,
            serverIp,
            cookie,
            url="/sys/base/boepaymentmode",
            **kwargs):
        """
        单据配置-配置结算方式分配
        """

        # 查适用核算主体
        data = {
            "page": 1,
            "limit": 20,
            "lovKey": "sysVendorMode.findFuLeMulti",
            "hasCount": "N"
        }
        r = self.FINDDATA(serverIp, cookie, data=data)
        leData = random.choice(r.get("page").get("list"))
        # 查结算方式
        data = {
            "page": 1,
            "limit": 20,
            "lovKey": "paymentMode.findNameAndCodeMultiple",
            "hasCount": "N"
        }
        r = self.FINDDATA(serverIp, cookie, data=data)
        paymentMethods = r.get("page").get("list")
        # 新增账户分配
        data = {
            "leId": leData.get("ID"),
            "leName": leData.get("NAME"),
            "paymentModeId": "^".join(i.get("ID") for i in paymentMethods),
            "paymentModeName": "^".join(i.get("NAME") or "" for i in paymentMethods),
            "boeTypeId": kwargs.get("boeTypeId")
        }
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        assert response.status_code == 200
        return response.json()

    def CONFIG_BOE_TEMPLATE_VOUCHER_TYPE(
            self,
            serverIp,
            cookie,
            url="/sys/base/boeconfigvoucher",
            **kwargs):
        """
        单据配置-配置凭证类型
        """

        # 新增账户分配
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        data = {
            "leId": "",
            "leName": "",
            "vendorType": "",
            "voucherCategory": "PAYABLE_VOUCHER",
            "voucherType": "ZE",
            "createNode": "001",
            "importNode": "",
            "whetherMerge": "1",
            "boeId": kwargs.get("boeTypeId")
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        assert response.status_code == 200
        return response.json()

    def ADD_LDG_BILL_ACCOUNT(self,
                             serverIp,
                             cookie,
                             leId_accountId_list, postalOrderCode,  # 汇票编码
                             preEndorseId,  # 往来方
                             operatorId, signEmpId,
                             billTypeCode,
                             url="/sys/ledger/ldgbillaccount",
                             **kwargs):
        """
        共享运营-支付中心-票据台账-应收汇票
        """
        leId, companyBankId, receiveBank, receiveAccountNum = leId_accountId_list  # 核算主体、归属账户、银行、银行账号
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        DEPT_ID = ""
        if operatorId:
            # 经办部门
            DEPT_ID = self.FINDDATA(serverIp, cookie, f'page=1&limit=10&orderField=&order=&lovKey=fscBillAccount.'
                                                      f'findEmpPostDept&ID={operatorId}').get('page').get('list')[
                0].get('DEPT_ID')

        billType = random.choice(["001", "002"])
        data = {
            "leId": leId,
            "leName": kwargs.get("leName"),
            "companyBankId": companyBankId,
            "companyBankName": kwargs.get("companyBankName"),
            "receiveBank": receiveBank,  # "国泰君安证券股份有限公司"
            "receiveAccountNum": receiveAccountNum,  # 654616846
            "postalOrderCode": postalOrderCode,  # 578687hpbm
            "billType": billType,
            "paperTypeCode": billType,
            "payVendorName": kwargs.get("payVendorName"),  # "578687cpf"
            "preEndorseId": preEndorseId,
            "preEndorseName": kwargs.get("preEndorseName"),  # "天津启明有限责任公司111"
            "ticketDate": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
            "billExpireDate": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
            "ticketAmount": random.randint(1, int(1e8)),  # 出票金额
            "contractCode": kwargs.get("contractCode"),  # 578687htbm  合同编码
            "operatorId": operatorId,
            "operatorName": kwargs.get("operatorName"),
            "operatorDeptId": DEPT_ID or kwargs.get("operatorDeptId"),
            "operatorDeptName": kwargs.get("operatorDeptName"),
            "signDate": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
            "signEmpId": signEmpId,
            "signEmpName": kwargs.get("signEmpName"),
            "billTypeCode": billType
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        assert response.status_code == 200
        return response.json()

    def ticketdefine_list(
            self,
            serverIp,
            cookie,
            url="/sys/base/ticketdefine/list",
            **kwargs):
        """
        获取发票模板信息
        """

        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        data = {
            "isPC": "0"
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data)
        assert response.status_code == 200
        return response.json()

    def boe_invoice_ticket_save(
            self,
            serverIp,
            cookie,
            url="/sys/boe/boeInvoiceTicket/save",
            **kwargs):
        """
        发票保存
        """

        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }

        fee = round(random.randint(1, 99999) + random.random(), 2)
        billingTime = datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d")
        data = {
            "billTypeInvoice": kwargs.get("billTypeInvoice"),
            "fee": fee,
            "billingTime": billingTime,
            "remarks": f"{kwargs.get('dataPre')}数据工厂制造",
            "opTicketDetailsList": [],
            "ticketData": {
                "modelType": "2",
                "fee": fee,
                "billingTime": billingTime,
                "remarks": f"{kwargs.get('dataPre')}数据工厂制造",
            },
            "ticketDefineTemplateId": kwargs.get("ticketDefineTemplateId")
        }
        if kwargs.get("billTypeInvoice") == "3":  # 其他纸质票
            invoiceCount = random.randint(1, 1000)
            data["invoiceCount"] = data["ticketData"]["invoiceCount"] = invoiceCount
        else:
            billingNo = self.random_character(length="12")
            billingCode = self.random_character(length="8")
            data["billingNo"] = data["ticketData"]["billingNo"] = billingNo
            data["billingCode"] = data["ticketData"]["billingCode"] = billingCode
            data["feeWithoutTax"] = data["ticketData"]["feeWithoutTax"] = fee
            data["tax"] = data["ticketData"]["tax"] = "0"
            data["checkCode"] = data["ticketData"]["checkCode"] = self.random_character(
                length=str(random.randint(4, 8)))

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        assert response.status_code == 200
        return response.json()

    def claimflowsummary_queryBankAccountNew(
            self,
            serverIp,
            cookie,
            inOrOut,
            isPay,
            url="/sys/claim/claimflowsummary/queryBankAccountNew",
            **kwargs):
        """
        认领-手工创建流水-查询收款方银行账户信息
        """

        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        data = {
            "page": 1,
            "limit": 100,
            "isPay": isPay,
            "validityFlag": 0,
            "inOrOut": inOrOut
        }

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data)
        assert response.status_code == 200
        return response.json()

    def vendors_listLeIdAndBank(
            self,
            serverIp,
            cookie,
            inOrOut,
            leId,
            isPay,
            url="/sys/base/vendors/listLeIdAndBank",
            **kwargs):
        """
        认领-手工创建流水-查询付款方银行账户信息
        """

        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        data = {
            "page": 1,
            "limit": 100,
            "isPay": isPay,
            "validityFlag": 0,
            "inOrOut": inOrOut,
            "leId": leId,
            "vendorTypeStr": "001^002^003",
            "lovKey": "sysVendorsBank.findEmployeeAndCustomer"
        }

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data)
        assert response.status_code == 200
        return response.json()

    def claimflowsummary(
            self,
            serverIp,
            cookie,
            url="/sys/claim/claimflowsummary",
            **kwargs):
        """
        流水保存接口
        """

        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        dataPre = kwargs.get('dataPre') or ""
        dirFlag = kwargs.get("dirflag")
        data = {
            "dirflag": dirFlag,
            "receiptAccount": kwargs.get("receiptInfo").get("accountNum"),
            "receiptName": kwargs.get("receiptInfo").get("accountName"),
            "receiptBankName": kwargs.get("receiptInfo").get("subBankName"),
            "currency": "CNY",
            "currencyName": "人民币",
            "amount": round(random.randint(1, 99999) + random.random(), 2),
            "actDate": datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S"),
            "useage": f"{dataPre}数据工厂_交易用途",
            "explainInfo": f"{dataPre}数据工厂_摘要",
            "lastUpdateBy": "高浩",
            "receiptNum": kwargs.get("receiptInfo").get("accountNum"),
            "receiptUnitedCode": kwargs.get("receiptInfo").get("unitedCode"),
            "payLeId": kwargs.get("receiptInfo").get("leId"),

        }
        if dirFlag in ("IN", "OUT"):
            if dirFlag == "OUT":
                outData = {
                    "receiptAccount": kwargs.get("receiptInfo").get("bankAccount"),
                    "receiptName": kwargs.get("receiptInfo").get("bankAccountName"),
                    "receiptBankName": kwargs.get("receiptInfo").get("subBank"),
                    "receiptNum": kwargs.get("receiptInfo").get("bankAccount"),
                    "receiptUnitedCode": kwargs.get("receiptInfo").get("unitedCode"),
                    "oppositeId": kwargs.get("receiptInfo").get("oppositeId")
                }
                data.update(outData)
            inData = {
                "hostid": self.random_character("int^str", str(random.randint(6, 12))),
                "payAccount": kwargs.get("payInfo").get("bankAccount") or kwargs.get("payInfo").get("accountNum"),
                "payName": kwargs.get("payInfo").get("vendorName") or kwargs.get("payInfo").get("accountName"),
                "payBankName": kwargs.get("payInfo").get("subBank") or kwargs.get("payInfo").get("subBankName"),
                "payNum": kwargs.get("payInfo").get("bankAccount") or kwargs.get("payInfo").get("accountNum"),
                "payUnitedCode": kwargs.get("payInfo").get("unitedCode") or kwargs.get("payInfo").get("unitedCode"),
                "vendorId": kwargs.get("payInfo").get("vendorId") or kwargs.get("receiptInfo").get("vendorId"),
                "vendorType": kwargs.get("payInfo").get("vendorType") or kwargs.get("receiptInfo").get("vendorType"),
            }
            data.update(inData)
        elif dirFlag == "BILL_IN":
            billInData = {
                "billNo": self.random_character("int^str", str(random.randint(6, 12))),
                "billType": "002",
                "drawer": Faker().name(),
                "drawerAccount": self.random_character("int", str(random.randint(8, 16))),
                "drwrAcctsvcrName": self.random_character("int", str(random.randint(8, 16))),
                "issueDate": datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d"),
                "dueDate": datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d")
            }
            data.update(billInData)
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        assert response.status_code == 200
        return response.json()

    def contract_addInitialData(
            self,
            serverIp,
            cookie,
            url="/sys/ledger/ldgcontract/addInitialData",
            **kwargs):
        """
        合同初始化接口
        """

        request_url = serverIp + url
        headers = {
            "Cookie": cookie
        }
        response = requests.put(
            timeout=timeout,
            url=request_url,
            headers=headers)
        assert response.status_code == 200
        return response.json()

    def vendors_listAndBank(
            self,
            serverIp,
            cookie,
            url="/sys/base/vendors/listAndBank",
            **kwargs):
        """
        新增合同-查询客商信息
        """

        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        data = {
            "page": "1",
            "limit": "100",
            "orderField": "",
            "order": "",
            "lovKey": "",
            "vendorType": "002"
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data)
        assert response.status_code == 200
        return response.json()

    def project_pageCollection(
            self,
            serverIp,
            cookie,
            url="/sys/base/project/pageCollection",
            **kwargs):
        """
        新增合同-查询项目信息
        """

        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        data = {
            "page": "1",
            "limit": "100",
            "orderField": "",
            "order": "",
            "blockCode": "0"
        }
        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            data=data)
        assert response.status_code == 200
        return response.json()

    def ldgcontract_submitContract(
            self,
            serverIp,
            cookie,
            initObj,
            prjObj,
            vendorObj,
            url="/sys/ledger/ldgcontract/submitContract",
            **kwargs):
        """
        新增合同-提交
        """

        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        dataPre = kwargs.get("dataPre") if kwargs.get("dataPre") else ""
        data = {
            "draftUserId": self.GET_DICT(initObj, "draftUserId"),
            "draftUserName": "user/post/dept",
            "contractType": "CT003",
            "contractName": f'{dataPre}{self.random_character("all", random.randint(4, 12))}',
            "contractCode": f'{dataPre}{self.random_character("int^str", random.randint(8, 16))}',
            "contractAmount": random.randint(1, 99999) + round(random.random(), 2),
            "currencyId": self.GET_DICT(initObj, "currencyId"),
            "currencyName": self.GET_DICT(initObj, "currencyName"),
            "vendorType": "002",
            "vendorId": "01c866dbffff9cc3aa3d0719b1b2b7ae03c2^01c866dbffff9f905d094bbcb1b2b7ae04cb",
            "vendorName": "蔡蔡专属供应商,李姿莹大客户",
            "signDate": datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d"),
            "respUserId": self.GET_DICT(initObj, "respUserId"),
            "respUserName": self.GET_DICT(initObj, "respUserName"),
            "respDeptId": self.GET_DICT(initObj, "respDeptId"),
            "respDeptName": self.GET_DICT(initObj, "respDeptName"),
            "ognId": self.GET_DICT(initObj, "ognId"),
            "ognName": self.GET_DICT(initObj, "ognName"),
            "contractScope": "N",
            "billingType": "JS002",
            "frameworkContract": "0",
            "haveImage": "N",
            "assProjectId": self.GET_DICT(prjObj, "id"),
            "assProjectName": self.GET_DICT(prjObj, "name"),
            "createTime": datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S"),
            "contractStatus": "7",
            "deptId": self.GET_DICT(initObj, "deptId"),
            "deptName": self.GET_DICT(initObj, "deptName"),
            "postId": self.GET_DICT(initObj, "postId"),
            "postName": self.GET_DICT(initObj, "postName"),
            "currencyCode": self.GET_DICT(initObj, "currencyCode"),
            "createBy": self.GET_DICT(initObj, "createBy"),
            "creatorName": self.GET_DICT(initObj, "creatorName"),
            "companyId": self.GET_DICT(initObj, "companyId"),
            "dataSource": "0",
            "dataSourceName": "新建",
            "contractPlansList": [],
            "attachmentList": [],
            "contractBankDTOS": None,
            "assProject": self.GET_DICT(prjObj, "code")
        }
        contractBankDTOS = [{
            "vendorId": v.get("id"),
            "vendorName": v.get("vendorName"),
            "vendorType": "002",
            # "bankAccountName": "供应商银行账户",
            # "bankAccount": "C02",
            # "subBank": "国泰君安证券股份有限公司",
            # "accountId": "01c866dbffff9cc3aae471e2b1b2b7ae03c6",
            # "bankNum": "310",
            # "unitedCode": "906290000019",
            # "vendorSitesTypeName": "2"
        } for v in vendorObj]
        data["contractBankDTOS"] = contractBankDTOS
        data["vendorId"] = "^".join(v.get("vendorId") for v in contractBankDTOS)
        data["vendorName"] = ",".join(v.get("vendorName") for v in contractBankDTOS)

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        assert response.status_code == 200
        return response.json()

    def base_currency_list(self, serverIp, cookie, url="/sys/base/currency/list"):
        """获取币种信息"""
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        data = {
            "page": "1",
            "limit": "100",
            "validityFlag": "0"
        }
        response = requests.post(timeout=timeout, url=request_url, headers=headers, data=data)
        assert response.status_code == 200
        return response.json()

    def budget_find_datas(self, serverIp, cookie, data, url="/sys/budget/lov/findDatas"):
        """预算-获取LOV数据。data：请求体数据"""
        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/x-www-form-urlencoded"
        }
        # print(f"---------->请求体：\n{data}\n")
        response = requests.post(timeout=timeout, url=request_url, headers=headers, data=data.encode('utf-8'))
        # print(f"----------> 获取LOV数据  接口响应：{response.text}")
        assert response.status_code == 200
        return response.json()

    def budget_bgttemplate(
            self,
            serverIp,
            cookie,
            url="/sys/budget/bgttemplate",
            **kwargs):
        """
        新增预算模板
        """

        request_url = serverIp + url
        headers = {
            "Cookie": cookie,
            "Content-Type": "application/json"
        }
        dataPre = kwargs.get("dataPre") if kwargs.get("dataPre") else ""
        templateCode = f"{dataPre}templateCode{self.random_character(length=6)}"
        templateName = f"{dataPre}templateName{self.random_character(length=6)}"
        templateNameEN = f"{dataPre}templateName_en{self.random_character(length=6)}"
        currency = kwargs.get("currency")
        view = kwargs.get("view")
        data = {
            "templateCode": templateCode,
            "templateName_zh-CN": templateName,
            "templateName_en-US": templateNameEN,
            "periodFlag": "Y",
            "currency": currency.get("currencyCode"),
            "currencyName": currency.get("currencyName"),
            "remark_zh-CN": "remark_zh_CN_数据工厂制造",
            "remark_en-US": "remark_en_US_数据工厂制造",
            "languages": [
                {
                    "language": "zh-CN",
                    "templateName": templateName,
                    "remark": "remark_zh_CN_数据工厂制造"
                },
                {
                    "language": "en-US",
                    "templateName": templateNameEN,
                    "remark": "remark_en_US_数据工厂制造"
                }
            ]
        }
        if view:
            data["viewId"] = view.get("ID")
            data["viewName"] = view.get("VIEW_NAME")

        response = requests.post(
            timeout=timeout,
            url=request_url,
            headers=headers,
            json=data)
        assert response.status_code == 200
        return response.json()


if __name__ == '__main__':
    _obj = '{"msg":"success","code":0,"page":{"totalCount":125,"pageSize":20,"totalPage":7,"currPage":1,"list":[{"id":"dbbabf45ffff8a409fa6be60b1b9b2ae0175","code":"test_999","subBank":"GP122342","bankAccountNum":"654616846","bankAccountName":"test_999","bankAccountType":"AN0001","fuId":"fdf80c050635a2731aa8b1b0aeb2007c","sobId":"b9287b05ffffd86838081bbeb1b9b2ae0025","accountId":null,"accountName":null,"unitedCode":"906290000019","collectionType":"RP0002","city":"上海","bankTypeCode":"310","inMoneyType":null,"province":"上海","bankHeadOffice":"国泰君安证券股份有限公司","currencyId":"e6156b76-0413-4971-8048-109286c06341^a90ec989-483c-4fc6-9eab-d149babcca01","currencyCode":"ZAR,CNY","currencyName":"兰特,人民币","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-04-28 14:33:57","lastUpdateBy":"e49ab6cb582b5bf165e6b1b9b2ae23b0","lastUpdateDate":"2022-05-18 09:30:12","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"国泰君安证券股份有限公司","language":"zh-CN","fuLeCode":"31103","fuLeName":"31103核算主体","bankAccountTypeName":"一般账户","collectionTypeName":"付款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":null,"ticketName":null,"isConnAccount":"","isConnAccountName":null,"isConnTicket":"","isConnTicketName":null,"bankLevel":999999999,"sysCompanyBankCurrencyDTOS":[{"id":"3bc556dcffffbb3365543115b1b9b2ae0236","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"e49ab6cb582b5bf165e6b1b9b2ae23b0","createDate":"2022-05-18 09:30:12","lastUpdateBy":"e49ab6cb582b5bf165e6b1b9b2ae23b0","lastUpdateDate":"2022-05-18 09:30:12","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"dbbabf45ffff8a409fa6be60b1b9b2ae0175","currencyId":"e6156b76-0413-4971-8048-109286c06341","currencyCode":"ZAR","currencyName":"兰特"},{"id":"3bc556dcffffbb336552c07fb1b9b2ae0235","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"e49ab6cb582b5bf165e6b1b9b2ae23b0","createDate":"2022-05-18 09:30:12","lastUpdateBy":"e49ab6cb582b5bf165e6b1b9b2ae23b0","lastUpdateDate":"2022-05-18 09:30:12","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"dbbabf45ffff8a409fa6be60b1b9b2ae0175","currencyId":"a90ec989-483c-4fc6-9eab-d149babcca01","currencyCode":"CNY","currencyName":"人民币"}]},{"id":"7fd61b405faf3d4c31d3b1b9b2ae000d","code":"errer","subBank":"GP122341","bankAccountNum":"989898787878754545454","bankAccountName":"港对的账户","bankAccountType":"AN0002","fuId":"ec88a9fe7a32f363dfb3b1b9b2ae00e6","sobId":"4f01c91bffffcccf39e6528db1b9b2ae0022","accountId":"","accountName":"","unitedCode":"906791000016","collectionType":"RP0003","city":"西安","bankTypeCode":"906","inMoneyType":null,"province":"陕西","bankHeadOffice":"平安银行","currencyId":"a90ec989-483c-4fc6-9eab-d149babcca01^cd22116b-4914-4b2e-b433-db5d1811a21d^cd9cb5b9-17a2-4b1a-bfcf-ef7bc394a491^cf59016e-c4fd-4465-b26c-7586d7f9d2d2^d0cb9571-d731-4953-8765-82d6ff4177f4^dbba626bffff900324a525a5b1b9b2ae0dda^e43d1f85-9ee1-4ac7-9003-2f77a9fb80fa^e6156b76-0413-4971-8048-109286c06341^e6817d4f-1410-4380-8427-c500c1fac05b^ea44ce1cffffb8b630101e55b1b9b2ae0ef6^ec93e7a2-0912-427d-ae94-d7b5204e27da","currencyCode":"CNY,GBP,RSD,ETB,GEL,NMY,BDT,ZAR,SDG,78768,CLP","currencyName":"人民币,英镑,第纳尔,比尔,拉里,新美元,塔卡,兰特,苏丹镑,测试发布,比索","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"8a4d7c3b29b816518510b1b9b2ae04d9","createDate":"2021-04-26 08:57:30","lastUpdateBy":"212364c2ffffd973a3c91109b1b9b2ae0196","lastUpdateDate":"2022-05-17 18:33:54","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"西安金融电子结算中心","language":"zh-CN","fuLeCode":"110110","fuLeName":"玉霞测试核算主体","bankAccountTypeName":"基本账户","collectionTypeName":"收付款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":"604f07626bafa31c29c2f0a6","ticketName":"收款账户票据科目","isConnAccount":"N","isConnAccountName":"否","isConnTicket":"Y","isConnTicketName":"是","bankLevel":989989898,"sysCompanyBankCurrencyDTOS":[{"id":"95d9c2f9ffff8a4a35be82c0b1b9b2ae003d","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"212364c2ffffd973a3c91109b1b9b2ae0196","createDate":"2022-05-17 18:33:54","lastUpdateBy":"212364c2ffffd973a3c91109b1b9b2ae0196","lastUpdateDate":"2022-05-17 18:33:54","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"7fd61b405faf3d4c31d3b1b9b2ae000d","currencyId":"a90ec989-483c-4fc6-9eab-d149babcca01","currencyCode":"CNY","currencyName":"人民币"},{"id":"95d9c2f9ffff8a4a35bd7374b1b9b2ae003c","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"212364c2ffffd973a3c91109b1b9b2ae0196","createDate":"2022-05-17 18:33:54","lastUpdateBy":"212364c2ffffd973a3c91109b1b9b2ae0196","lastUpdateDate":"2022-05-17 18:33:54","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"7fd61b405faf3d4c31d3b1b9b2ae000d","currencyId":"cd22116b-4914-4b2e-b433-db5d1811a21d","currencyCode":"GBP","currencyName":"英镑"},{"id":"95d9c2f9ffff8a4a35bc9551b1b9b2ae003b","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"212364c2ffffd973a3c91109b1b9b2ae0196","createDate":"2022-05-17 18:33:54","lastUpdateBy":"212364c2ffffd973a3c91109b1b9b2ae0196","lastUpdateDate":"2022-05-17 18:33:54","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"7fd61b405faf3d4c31d3b1b9b2ae000d","currencyId":"cd9cb5b9-17a2-4b1a-bfcf-ef7bc394a491","currencyCode":"RSD","currencyName":"第纳尔"},{"id":"95d9c2f9ffff8a4a35bbb0eab1b9b2ae003a","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"212364c2ffffd973a3c91109b1b9b2ae0196","createDate":"2022-05-17 18:33:54","lastUpdateBy":"212364c2ffffd973a3c91109b1b9b2ae0196","lastUpdateDate":"2022-05-17 18:33:54","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"7fd61b405faf3d4c31d3b1b9b2ae000d","currencyId":"cf59016e-c4fd-4465-b26c-7586d7f9d2d2","currencyCode":"ETB","currencyName":"比尔"},{"id":"95d9c2f9ffff8a4a35baac2cb1b9b2ae0039","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"212364c2ffffd973a3c91109b1b9b2ae0196","createDate":"2022-05-17 18:33:54","lastUpdateBy":"212364c2ffffd973a3c91109b1b9b2ae0196","lastUpdateDate":"2022-05-17 18:33:54","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"7fd61b405faf3d4c31d3b1b9b2ae000d","currencyId":"d0cb9571-d731-4953-8765-82d6ff4177f4","currencyCode":"GEL","currencyName":"拉里"},{"id":"95d9c2f9ffff8a4a35b967e6b1b9b2ae0038","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"212364c2ffffd973a3c91109b1b9b2ae0196","createDate":"2022-05-17 18:33:54","lastUpdateBy":"212364c2ffffd973a3c91109b1b9b2ae0196","lastUpdateDate":"2022-05-17 18:33:54","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"7fd61b405faf3d4c31d3b1b9b2ae000d","currencyId":"dbba626bffff900324a525a5b1b9b2ae0dda","currencyCode":"NMY","currencyName":"新美元"},{"id":"95d9c2f9ffff8a4a35b84961b1b9b2ae0037","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"212364c2ffffd973a3c91109b1b9b2ae0196","createDate":"2022-05-17 18:33:54","lastUpdateBy":"212364c2ffffd973a3c91109b1b9b2ae0196","lastUpdateDate":"2022-05-17 18:33:54","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"7fd61b405faf3d4c31d3b1b9b2ae000d","currencyId":"e43d1f85-9ee1-4ac7-9003-2f77a9fb80fa","currencyCode":"BDT","currencyName":"塔卡"},{"id":"95d9c2f9ffff8a4a35b70b1db1b9b2ae0036","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"212364c2ffffd973a3c91109b1b9b2ae0196","createDate":"2022-05-17 18:33:54","lastUpdateBy":"212364c2ffffd973a3c91109b1b9b2ae0196","lastUpdateDate":"2022-05-17 18:33:54","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"7fd61b405faf3d4c31d3b1b9b2ae000d","currencyId":"e6156b76-0413-4971-8048-109286c06341","currencyCode":"ZAR","currencyName":"兰特"},{"id":"95d9c2f9ffff8a4a35b62427b1b9b2ae0035","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"212364c2ffffd973a3c91109b1b9b2ae0196","createDate":"2022-05-17 18:33:54","lastUpdateBy":"212364c2ffffd973a3c91109b1b9b2ae0196","lastUpdateDate":"2022-05-17 18:33:54","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"7fd61b405faf3d4c31d3b1b9b2ae000d","currencyId":"e6817d4f-1410-4380-8427-c500c1fac05b","currencyCode":"SDG","currencyName":"苏丹镑"},{"id":"95d9c2f9ffff8a4a35b50ce1b1b9b2ae0034","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"212364c2ffffd973a3c91109b1b9b2ae0196","createDate":"2022-05-17 18:33:54","lastUpdateBy":"212364c2ffffd973a3c91109b1b9b2ae0196","lastUpdateDate":"2022-05-17 18:33:54","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"7fd61b405faf3d4c31d3b1b9b2ae000d","currencyId":"ea44ce1cffffb8b630101e55b1b9b2ae0ef6","currencyCode":"78768","currencyName":"测试发布"},{"id":"95d9c2f9ffff8a4a35b1cb71b1b9b2ae0033","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"212364c2ffffd973a3c91109b1b9b2ae0196","createDate":"2022-05-17 18:33:54","lastUpdateBy":"212364c2ffffd973a3c91109b1b9b2ae0196","lastUpdateDate":"2022-05-17 18:33:54","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"7fd61b405faf3d4c31d3b1b9b2ae000d","currencyId":"ec93e7a2-0912-427d-ae94-d7b5204e27da","currencyCode":"CLP","currencyName":"比索"}]},{"id":"92a80965ffffdb16d39fe147b1b9b2ae0057","code":"autoTest_compBankwdYnnjDC","subBank":"GP122340","bankAccountNum":"autoTest_compBankwdYnnjDC","bankAccountName":"autoTest_公司账户wdYnnjDC","bankAccountType":"AN0001","fuId":"d1d833a7060bbded7efab1b9b2ae0f1c","sobId":"d1d833a7060b5e2d977db1b9b2ae0f11","accountId":null,"accountName":null,"unitedCode":"906191000015","collectionType":"RP0001","city":"呼和浩特","bankTypeCode":"906","inMoneyType":null,"province":"内蒙古","bankHeadOffice":"平安银行","currencyId":"ec93e7a2-0912-427d-ae94-d7b5204e27da","currencyCode":"CLP","currencyName":"比索","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-04-29 15:15:18","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-04-29 15:15:18","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"全国综合业务服务平台","language":"zh-CN","fuLeCode":"wds2thisCode","fuLeName":"wds2thisName","bankAccountTypeName":"一般账户","collectionTypeName":"收款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":null,"ticketName":null,"isConnAccount":"N","isConnAccountName":"否","isConnTicket":"N","isConnTicketName":"否","bankLevel":961701435,"sysCompanyBankCurrencyDTOS":[{"id":"92a80965ffffdb16d496fc55b1b9b2ae0058","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-04-29 15:15:18","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-04-29 15:15:18","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"92a80965ffffdb16d39fe147b1b9b2ae0057","currencyId":"ec93e7a2-0912-427d-ae94-d7b5204e27da","currencyCode":"CLP","currencyName":"比索"}]},{"id":"0925e85bffff884b98f4aa76b1b9b2ae0015","code":"TEST_compBank10220387","subBank":"GP122333","bankAccountNum":"TEST_compBank10220387","bankAccountName":"TEST_公司账户10220387","bankAccountType":"AN0003","fuId":"cb24d6cbffffe865029769fdb1b2b7ae05c2","sobId":"4f01c91bffffcccf39e58193b1b9b2ae001f","accountId":null,"accountName":null,"unitedCode":"906581000018","collectionType":"RP0003","city":"广州","bankTypeCode":"906","inMoneyType":null,"province":"广东","bankHeadOffice":"平安银行","currencyId":"7d17c5b7-4e74-44d2-8d18-687d31e39489","currencyCode":"PLN","currencyName":"兹罗提","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-04-28 13:58:05","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-04-28 13:58:05","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"广州银行电子结算中心","language":"zh-CN","fuLeCode":"1565","fuLeName":"测试1465","bankAccountTypeName":"农网专户","collectionTypeName":"收付款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":null,"ticketName":null,"isConnAccount":"N","isConnAccountName":"否","isConnTicket":"Y","isConnTicketName":"是","bankLevel":483010870,"sysCompanyBankCurrencyDTOS":[{"id":"0925e85bffff884b9a394b99b1b9b2ae0016","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-04-28 13:58:05","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-04-28 13:58:05","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"0925e85bffff884b98f4aa76b1b9b2ae0015","currencyId":"7d17c5b7-4e74-44d2-8d18-687d31e39489","currencyCode":"PLN","currencyName":"兹罗提"}]},{"id":"9e5fcc8e7fb1d0513656b1b9b2ae0418","code":"20220428_compBank21110428","subBank":"GP122299","bankAccountNum":"20220428_compBank21110428","bankAccountName":"20220428_公司账户21110428","bankAccountType":"AN0003","fuId":"eb952adb3bdb57a78607b1b9b2ae011f","sobId":"eb952adb3bcee6ec8b96b1b9b2ae011c","accountId":null,"accountName":null,"unitedCode":"785581000003","collectionType":"RP0002","city":"广州","bankTypeCode":"785","inMoneyType":null,"province":"广东","bankHeadOffice":"华商银行","currencyId":"e43d1f85-9ee1-4ac7-9003-2f77a9fb80fa","currencyCode":"BDT","currencyName":"塔卡","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-04-28 11:20:28","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-04-28 11:20:28","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"华商银行广州分行","language":"zh-CN","fuLeCode":"lijiaoli","fuLeName":"李姣丽测试核算主体","bankAccountTypeName":"农网专户","collectionTypeName":"付款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":null,"ticketName":null,"isConnAccount":"N","isConnAccountName":"否","isConnTicket":"N","isConnTicketName":"否","bankLevel":315467733,"sysCompanyBankCurrencyDTOS":[{"id":"9e5fcc8e7fb1d102677fb1b9b2ae0419","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-04-28 11:20:28","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-04-28 11:20:28","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"9e5fcc8e7fb1d0513656b1b9b2ae0418","currencyId":"e43d1f85-9ee1-4ac7-9003-2f77a9fb80fa","currencyCode":"BDT","currencyName":"塔卡"}]},{"id":"dbbabf45ffff8a6eb687d4f2b1b9b2ae0234","code":"testgh002","subBank":"GP122343","bankAccountNum":"2321","bankAccountName":"3213213","bankAccountType":"AN0001","fuId":"eeef226542801c88ac6db1b9b2ae0055","sobId":"4f01c91bffffcccf39e6528db1b9b2ae0022","accountId":null,"accountName":null,"unitedCode":"909290000007","collectionType":"RP0002","city":"上海","bankTypeCode":"909","inMoneyType":null,"province":"上海","bankHeadOffice":"工行一汽支行","currencyId":"e6156b76-0413-4971-8048-109286c06341","currencyCode":"ZAR","currencyName":"兰特","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-04-28 14:37:15","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-04-28 14:37:15","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"银行间市场清算所","language":"zh-CN","fuLeCode":"0110101","fuLeName":"核算主体01010101","bankAccountTypeName":"一般账户","collectionTypeName":"付款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":null,"ticketName":null,"isConnAccount":"","isConnAccountName":null,"isConnTicket":"","isConnTicketName":null,"bankLevel":223213213,"sysCompanyBankCurrencyDTOS":[{"id":"dbbabf45ffff8a6eb6ebd1c2b1b9b2ae0235","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-04-28 14:37:15","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-04-28 14:37:15","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"dbbabf45ffff8a6eb687d4f2b1b9b2ae0234","currencyId":"e6156b76-0413-4971-8048-109286c06341","currencyCode":"ZAR","currencyName":"兰特"}]},{"id":"0925e85bffff8864166b4851b1b9b2ae0017","code":"20220428_compBank82417370","subBank":"GP122308","bankAccountNum":"20220428_compBank82417370","bankAccountName":"20220428_公司账户82417370","bankAccountType":"AN0002","fuId":"fac1b8e2ffffb3a810fc8ac8b1b0aeb20002","sobId":"a92129287714c5a14fe5b1b9b2ae0024","accountId":null,"accountName":null,"unitedCode":"787290000168","collectionType":"RP0001","city":"上海","bankTypeCode":"787","inMoneyType":null,"province":"上海","bankHeadOffice":"华一银行","currencyId":"22b1a107-3c88-4ca3-b43c-ee30a5925509","currencyCode":"UGX","currencyName":"乌先令","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-04-28 13:59:50","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-04-28 13:59:50","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"富邦华一银行有限公司上海新天地支行","language":"zh-CN","fuLeCode":"sltest123","fuLeName":"sltest123","bankAccountTypeName":"基本账户","collectionTypeName":"收款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":null,"ticketName":null,"isConnAccount":"N","isConnAccountName":"否","isConnTicket":"Y","isConnTicketName":"是","bankLevel":195029123,"sysCompanyBankCurrencyDTOS":[{"id":"0925e85bffff886416abe283b1b9b2ae0018","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-04-28 13:59:50","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-04-28 13:59:50","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"0925e85bffff8864166b4851b1b9b2ae0017","currencyId":"22b1a107-3c88-4ca3-b43c-ee30a5925509","currencyCode":"UGX","currencyName":"乌先令"}]},{"id":"0925e85bffff88a3345b192ab1b9b2ae0019","code":"20220428_compBank13646671","subBank":"GP122307","bankAccountNum":"20220428_compBank13646671","bankAccountName":"20220428_公司账户13646671","bankAccountType":"AN0001","fuId":"cb24d6cbffffe86502a30e5cb1b2b7ae05cd","sobId":"4f01c91bffffcccf39e58193b1b9b2ae001f","accountId":null,"accountName":null,"unitedCode":"787290000051","collectionType":"RP0001","city":"上海","bankTypeCode":"787","inMoneyType":null,"province":"上海","bankHeadOffice":"华一银行","currencyId":"9294827e-1555-4766-a7fb-856637f2c44e","currencyCode":"PKR","currencyName":"卢比","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-04-28 14:04:21","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-04-28 14:04:21","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"富邦华一银行有限公司上海嘉定支行","language":"zh-CN","fuLeCode":"1576","fuLeName":"测试1476","bankAccountTypeName":"一般账户","collectionTypeName":"收款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":null,"ticketName":null,"isConnAccount":"N","isConnAccountName":"否","isConnTicket":"N","isConnTicketName":"否","bankLevel":138245107,"sysCompanyBankCurrencyDTOS":[{"id":"0925e85bffff88a334837f82b1b9b2ae001a","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-04-28 14:04:21","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-04-28 14:04:21","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"0925e85bffff88a3345b192ab1b9b2ae0019","currencyId":"9294827e-1555-4766-a7fb-856637f2c44e","currencyCode":"PKR","currencyName":"卢比"}]},{"id":"ef6c1c47ffff970bacffc43eb1b9b2ae04fe","code":"12313131","subBank":"GP122343","bankAccountNum":"141241241","bankAccountName":"1241241241","bankAccountType":"AN0002","fuId":"fac1b8e2ffffb3ac53490f4cb1b0aeb20006","sobId":"4e0ad9bf719b3d5416aab1b9b2ae004d","accountId":null,"accountName":null,"unitedCode":"909290000007","collectionType":"RP0001","city":"上海","bankTypeCode":"909","inMoneyType":null,"province":"上海","bankHeadOffice":"工行一汽支行","currencyId":"ec93e7a2-0912-427d-ae94-d7b5204e27da","currencyCode":"CLP","currencyName":"比索","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"cb05ce77-c491-4e30-bc5e-b22f9024a304","createDate":"2022-05-11 19:28:05","lastUpdateBy":"cb05ce77-c491-4e30-bc5e-b22f9024a304","lastUpdateDate":"2022-05-11 19:28:05","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"银行间市场清算所","language":"zh-CN","fuLeCode":"sltest123","fuLeName":"sltest123","bankAccountTypeName":"基本账户","collectionTypeName":"收款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":null,"ticketName":null,"isConnAccount":"","isConnAccountName":null,"isConnTicket":"","isConnTicketName":null,"bankLevel":12313131,"sysCompanyBankCurrencyDTOS":[{"id":"ef6c1c47ffff970badac3cd2b1b9b2ae04ff","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"cb05ce77-c491-4e30-bc5e-b22f9024a304","createDate":"2022-05-11 19:28:05","lastUpdateBy":"cb05ce77-c491-4e30-bc5e-b22f9024a304","lastUpdateDate":"2022-05-11 19:28:05","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"ef6c1c47ffff970bacffc43eb1b9b2ae04fe","currencyId":"ec93e7a2-0912-427d-ae94-d7b5204e27da","currencyCode":"CLP","currencyName":"比索"}]},{"id":"02a2ed4bffffb6b534c5bfd6b1b9b2ae013f","code":"74857485","subBank":"GP122342","bankAccountNum":"3453543234234","bankAccountName":"daonge","bankAccountType":"AN0001","fuId":"eb952adb2b987516bac4b1b9b2ae00e7","sobId":"eb952adb2b94c18274b3b1b9b2ae00e4","accountId":null,"accountName":null,"unitedCode":"906290000019","collectionType":"RP0003","city":"上海","bankTypeCode":"310","inMoneyType":null,"province":"上海","bankHeadOffice":"国泰君安证券股份有限公司","currencyId":"8e5a0216-041e-4c39-881f-a432931c4310^d0cb9571-d731-4953-8765-82d6ff4177f4^e43d1f85-9ee1-4ac7-9003-2f77a9fb80fa^e6156b76-0413-4971-8048-109286c06341^e6817d4f-1410-4380-8427-c500c1fac05b^ec93e7a2-0912-427d-ae94-d7b5204e27da","currencyCode":"AUD,GEL,BDT,ZAR,SDG,CLP","currencyName":"澳元,拉里,塔卡,兰特,苏丹镑,比索","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"633ad43effffc07179286204b1b9b2ae04d9","createDate":"2021-12-24 13:56:58","lastUpdateBy":"d422df172bb97977f065b1b9b2ae072b","lastUpdateDate":"2022-05-16 17:04:11","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"国泰君安证券股份有限公司","language":"zh-CN","fuLeCode":"sususussuusus","fuLeName":"苏林子测试核算主体","bankAccountTypeName":"一般账户","collectionTypeName":"收付款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":null,"ticketName":null,"isConnAccount":"","isConnAccountName":null,"isConnTicket":"","isConnTicketName":null,"bankLevel":7777777,"sysCompanyBankCurrencyDTOS":[{"id":"a2eb30c136d041fbe459b1b9b2ae07e0","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"d422df172bb97977f065b1b9b2ae072b","createDate":"2022-05-16 17:04:11","lastUpdateBy":"d422df172bb97977f065b1b9b2ae072b","lastUpdateDate":"2022-05-16 17:04:11","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"02a2ed4bffffb6b534c5bfd6b1b9b2ae013f","currencyId":"8e5a0216-041e-4c39-881f-a432931c4310","currencyCode":"AUD","currencyName":"澳元"},{"id":"a2eb30c136d041fbc31bb1b9b2ae07df","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"d422df172bb97977f065b1b9b2ae072b","createDate":"2022-05-16 17:04:11","lastUpdateBy":"d422df172bb97977f065b1b9b2ae072b","lastUpdateDate":"2022-05-16 17:04:11","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"02a2ed4bffffb6b534c5bfd6b1b9b2ae013f","currencyId":"d0cb9571-d731-4953-8765-82d6ff4177f4","currencyCode":"GEL","currencyName":"拉里"},{"id":"a2eb30c136d041fba186b1b9b2ae07de","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"d422df172bb97977f065b1b9b2ae072b","createDate":"2022-05-16 17:04:11","lastUpdateBy":"d422df172bb97977f065b1b9b2ae072b","lastUpdateDate":"2022-05-16 17:04:11","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"02a2ed4bffffb6b534c5bfd6b1b9b2ae013f","currencyId":"e43d1f85-9ee1-4ac7-9003-2f77a9fb80fa","currencyCode":"BDT","currencyName":"塔卡"},{"id":"a2eb30c136d041fb7e86b1b9b2ae07dd","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"d422df172bb97977f065b1b9b2ae072b","createDate":"2022-05-16 17:04:11","lastUpdateBy":"d422df172bb97977f065b1b9b2ae072b","lastUpdateDate":"2022-05-16 17:04:11","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"02a2ed4bffffb6b534c5bfd6b1b9b2ae013f","currencyId":"e6156b76-0413-4971-8048-109286c06341","currencyCode":"ZAR","currencyName":"兰特"},{"id":"a2eb30c136d041fb54c0b1b9b2ae07dc","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"d422df172bb97977f065b1b9b2ae072b","createDate":"2022-05-16 17:04:11","lastUpdateBy":"d422df172bb97977f065b1b9b2ae072b","lastUpdateDate":"2022-05-16 17:04:11","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"02a2ed4bffffb6b534c5bfd6b1b9b2ae013f","currencyId":"e6817d4f-1410-4380-8427-c500c1fac05b","currencyCode":"SDG","currencyName":"苏丹镑"},{"id":"a2eb30c136d041fa8a3fb1b9b2ae07db","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"d422df172bb97977f065b1b9b2ae072b","createDate":"2022-05-16 17:04:11","lastUpdateBy":"d422df172bb97977f065b1b9b2ae072b","lastUpdateDate":"2022-05-16 17:04:11","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"02a2ed4bffffb6b534c5bfd6b1b9b2ae013f","currencyId":"ec93e7a2-0912-427d-ae94-d7b5204e27da","currencyCode":"CLP","currencyName":"比索"}]},{"id":"5737d691ffffb4d258d09ca0b1b9b2ae002d","code":"test-gh12121","subBank":"GP122342","bankAccountNum":"332132131232","bankAccountName":"test-gh12121test-gh12121","bankAccountType":"AN0001","fuId":"4f01c91bffffccd559d1aa8cb1b9b2ae002f","sobId":"4f01c91bffffcccf39e58193b1b9b2ae001f","accountId":null,"accountName":null,"unitedCode":"906290000019","collectionType":"RP0003","city":"上海","bankTypeCode":"310","inMoneyType":null,"province":"上海","bankHeadOffice":"国泰君安证券股份有限公司","currencyId":"a90ec989-483c-4fc6-9eab-d149babcca01^ec93e7a2-0912-427d-ae94-d7b5204e27da","currencyCode":"CNY,CLP","currencyName":"人民币,比索","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-05-11 19:10:48","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-05-16 19:39:46","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"国泰君安证券股份有限公司","language":"zh-CN","fuLeCode":"XY","fuLeName":"演示公司","bankAccountTypeName":"一般账户","collectionTypeName":"收付款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":null,"ticketName":null,"isConnAccount":"Y","isConnAccountName":"是","isConnTicket":"N","isConnTicketName":"否","bankLevel":3213213,"sysCompanyBankCurrencyDTOS":[{"id":"02c4c2113f4dc630509fb1b9b2ae0065","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-05-16 19:39:46","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-05-16 19:39:46","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"5737d691ffffb4d258d09ca0b1b9b2ae002d","currencyId":"a90ec989-483c-4fc6-9eab-d149babcca01","currencyCode":"CNY","currencyName":"人民币"},{"id":"02c4c2113f4dc62ec90fb1b9b2ae0064","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-05-16 19:39:46","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-05-16 19:39:46","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"5737d691ffffb4d258d09ca0b1b9b2ae002d","currencyId":"ec93e7a2-0912-427d-ae94-d7b5204e27da","currencyCode":"CLP","currencyName":"比索"}]},{"id":"a2eb30c135588b4cb975b1b9b2ae06b2","code":"1223","subBank":"GP122341","bankAccountNum":"5554444","bankAccountName":"谢佳核算主体","bankAccountType":"AN0001","fuId":"4f01c91bffffccd559d1aa8cb1b9b2ae002f","sobId":"4f01c91bffffcccf39e58193b1b9b2ae001f","accountId":null,"accountName":null,"unitedCode":"906791000016","collectionType":"RP0003","city":"西安","bankTypeCode":"906","inMoneyType":null,"province":"陕西","bankHeadOffice":"平安银行","currencyId":"18d7330c-089a-4234-99f1-4cc5b3f8cfff","currencyCode":"BGN","currencyName":"列弗","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"d422df17fffff50c7043cf46b1b9b2ae06ce","createDate":"2022-05-16 16:37:17","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-05-16 20:25:45","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"西安金融电子结算中心","language":"zh-CN","fuLeCode":"XY","fuLeName":"演示公司","bankAccountTypeName":"一般账户","collectionTypeName":"收付款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":null,"ticketName":null,"isConnAccount":"Y","isConnAccountName":"是","isConnTicket":"Y","isConnTicketName":"是","bankLevel":2313213,"sysCompanyBankCurrencyDTOS":[{"id":"02c4c21141d02587539eb1b9b2ae0078","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-05-16 20:25:45","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-05-16 20:25:45","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"a2eb30c135588b4cb975b1b9b2ae06b2","currencyId":"18d7330c-089a-4234-99f1-4cc5b3f8cfff","currencyCode":"BGN","currencyName":"列弗"}]},{"id":"413a1600fffffc8e37e93ad6b1b9b2ae0051","code":"001","subBank":"GP122342","bankAccountNum":"123456","bankAccountName":"深圳市中兴新云服务有限公司","bankAccountType":"AN0001","fuId":"4f01c91bffffccd559d1aa8cb1b9b2ae002f","sobId":"4f01c91bffffcccf39e58193b1b9b2ae001f","accountId":"8cf2ae42ffffd36c0d871404b1b9b2ae6cc8","accountName":"B89996","unitedCode":"906290000019","collectionType":"RP0003","city":"上海","bankTypeCode":"310","inMoneyType":null,"province":"上海","bankHeadOffice":"国泰君安证券股份有限公司","currencyId":"a90ec989-483c-4fc6-9eab-d149babcca01^810649b1-4a71-4ace-acd1-1ccc0deaac79","currencyCode":"CNY,USD","currencyName":"人民币,美元","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"633ad43effffc071c0c8dd6bb1b9b2ae0501","createDate":"2021-03-22 10:25:08","lastUpdateBy":"633ad43effffc071dceffbfab1b9b2ae0511","lastUpdateDate":"2021-12-23 11:02:40","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"国泰君安证券股份有限公司","language":"zh-CN","fuLeCode":"XY","fuLeName":"演示公司","bankAccountTypeName":"一般账户","collectionTypeName":"收付款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":"604f07616bafa31c29c2ef82","ticketName":"银行存款","isConnAccount":"Y","isConnAccountName":"是","isConnTicket":"Y","isConnTicketName":"是","bankLevel":999641,"sysCompanyBankCurrencyDTOS":[{"id":"db4f5dba50e1904cd26cb1b0aeb20003","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"633ad43effffc071dceffbfab1b9b2ae0511","createDate":"2021-12-23 11:02:40","lastUpdateBy":"633ad43effffc071dceffbfab1b9b2ae0511","lastUpdateDate":"2021-12-23 11:02:40","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"413a1600fffffc8e37e93ad6b1b9b2ae0051","currencyId":"a90ec989-483c-4fc6-9eab-d149babcca01","currencyCode":"CNY","currencyName":"人民币"},{"id":"db4f5dba50e1904b9028b1b0aeb20002","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"633ad43effffc071dceffbfab1b9b2ae0511","createDate":"2021-12-23 11:02:40","lastUpdateBy":"633ad43effffc071dceffbfab1b9b2ae0511","lastUpdateDate":"2021-12-23 11:02:40","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"413a1600fffffc8e37e93ad6b1b9b2ae0051","currencyId":"810649b1-4a71-4ace-acd1-1ccc0deaac79","currencyCode":"USD","currencyName":"美元"}]},{"id":"b1c6adb7ffffd5e12b720230b1b9b2ae13a1","code":"777777","subBank":"GP122342","bankAccountNum":"888888888888888","bankAccountName":"88888","bankAccountType":"AN0001","fuId":"4f01c91bffffccd559d1aa8cb1b9b2ae002f","sobId":"4f01c91bffffcccf39e58193b1b9b2ae001f","accountId":null,"accountName":null,"unitedCode":"906290000019","collectionType":"RP0003","city":"上海","bankTypeCode":"310","inMoneyType":null,"province":"上海","bankHeadOffice":"国泰君安证券股份有限公司","currencyId":"a90ec989-483c-4fc6-9eab-d149babcca01","currencyCode":"CNY","currencyName":"人民币","remark":null,"validityFlag":"1","enabledFlag":"0","createBy":"633ad43effffc071dceffbfab1b9b2ae0511","createDate":"2021-12-21 17:16:57","lastUpdateBy":"633ad43effffc071dceffbfab1b9b2ae0511","lastUpdateDate":"2021-12-23 10:51:56","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"国泰君安证券股份有限公司","language":"zh-CN","fuLeCode":"XY","fuLeName":"演示公司","bankAccountTypeName":"一般账户","collectionTypeName":"收付款","validityName":"无效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":null,"ticketName":null,"isConnAccount":"Y","isConnAccountName":"是","isConnTicket":"","isConnTicketName":null,"bankLevel":888888,"sysCompanyBankCurrencyDTOS":[{"id":"db4f5dba504b8f7830d4b1b0aeb20001","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"633ad43effffc071dceffbfab1b9b2ae0511","createDate":"2021-12-23 10:51:56","lastUpdateBy":"633ad43effffc071dceffbfab1b9b2ae0511","lastUpdateDate":"2021-12-23 10:51:56","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"b1c6adb7ffffd5e12b720230b1b9b2ae13a1","currencyId":"a90ec989-483c-4fc6-9eab-d149babcca01","currencyCode":"CNY","currencyName":"人民币"}]},{"id":"c2c65fcafffffa86484ccd84b1b9b2ae00f2","code":"324324","subBank":"GP122343","bankAccountNum":"32243243","bankAccountName":"232","bankAccountType":"AN0002","fuId":"ec88a9fe7a32f363dfb3b1b9b2ae00e6","sobId":"4f01c91bffffcccf39e6528db1b9b2ae0022","accountId":null,"accountName":null,"unitedCode":"909290000007","collectionType":"RP0003","city":"上海","bankTypeCode":"909","inMoneyType":null,"province":"上海","bankHeadOffice":"工行一汽支行","currencyId":"a90ec989-483c-4fc6-9eab-d149babcca01","currencyCode":"CNY","currencyName":"人民币","remark":null,"validityFlag":"1","enabledFlag":"0","createBy":"633ad43effffc07179286204b1b9b2ae04d9","createDate":"2021-12-02 15:20:59","lastUpdateBy":"633ad43effffc07179286204b1b9b2ae04d9","lastUpdateDate":"2021-12-02 15:20:59","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"银行间市场清算所","language":"zh-CN","fuLeCode":"110110","fuLeName":"玉霞测试核算主体","bankAccountTypeName":"基本账户","collectionTypeName":"收付款","validityName":"无效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":null,"ticketName":null,"isConnAccount":"N","isConnAccountName":"否","isConnTicket":"N","isConnTicketName":"否","bankLevel":323234,"sysCompanyBankCurrencyDTOS":[{"id":"c2c65fcafffffa864932a559b1b9b2ae00f3","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"633ad43effffc07179286204b1b9b2ae04d9","createDate":"2021-12-02 15:20:59","lastUpdateBy":"633ad43effffc07179286204b1b9b2ae04d9","lastUpdateDate":"2021-12-02 15:20:59","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"c2c65fcafffffa86484ccd84b1b9b2ae00f2","currencyId":"a90ec989-483c-4fc6-9eab-d149babcca01","currencyCode":"CNY","currencyName":"人民币"}]},{"id":"85edbaf7ffffae99ce3aaf22b1b9b2ae015c","code":"testgh01","subBank":"GP122343","bankAccountNum":"23123123","bankAccountName":"test-gh","bankAccountType":"AN0001","fuId":"fac1b8e2ffffb3ac53490f4cb1b0aeb20006","sobId":"4e0ad9bf719b3d5416aab1b9b2ae004d","accountId":null,"accountName":null,"unitedCode":"909290000007","collectionType":"RP0002","city":"上海","bankTypeCode":"909","inMoneyType":null,"province":"上海","bankHeadOffice":"工行一汽支行","currencyId":"ec93e7a2-0912-427d-ae94-d7b5204e27da^ea44ce1cffffb8b630101e55b1b9b2ae0ef6","currencyCode":"CLP,78768","currencyName":"比索,测试发布","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-05-11 17:16:48","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-05-11 17:16:48","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"银行间市场清算所","language":"zh-CN","fuLeCode":"sltest123","fuLeName":"sltest123","bankAccountTypeName":"一般账户","collectionTypeName":"付款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":null,"ticketName":null,"isConnAccount":"","isConnAccountName":null,"isConnTicket":"","isConnTicketName":null,"bankLevel":321312,"sysCompanyBankCurrencyDTOS":[{"id":"85edbaf7ffffae99ce9051aab1b9b2ae015e","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-05-11 17:16:48","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-05-11 17:16:48","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"85edbaf7ffffae99ce3aaf22b1b9b2ae015c","currencyId":"ec93e7a2-0912-427d-ae94-d7b5204e27da","currencyCode":"CLP","currencyName":"比索"},{"id":"85edbaf7ffffae99ce8f09b0b1b9b2ae015d","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","createDate":"2022-05-11 17:16:48","lastUpdateBy":"8a6e8add36ba6c3500d6b1b9b2ae01dc","lastUpdateDate":"2022-05-11 17:16:48","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"85edbaf7ffffae99ce3aaf22b1b9b2ae015c","currencyId":"ea44ce1cffffb8b630101e55b1b9b2ae0ef6","currencyCode":"78768","currencyName":"测试发布"}]},{"id":"bfb3e27e710676e5fc8db1b9b2ae002b","code":"23424","subBank":"GP122340","bankAccountNum":"353534534535","bankAccountName":"认领账户3","bankAccountType":"AN0001","fuId":"4f01c91bffffccd559d1aa8cb1b9b2ae002f","sobId":"4f01c91bffffcccf39e58193b1b9b2ae001f","accountId":"fb6dfa4136f19055349ab1b9b2ae055b","accountName":"汇兑损失","unitedCode":"906191000015","collectionType":"RP0003","city":"呼和浩特","bankTypeCode":"906","inMoneyType":null,"province":"内蒙古","bankHeadOffice":"国泰君安证券股份有限公司","currencyId":"a90ec989-483c-4fc6-9eab-d149babcca01","currencyCode":"CNY","currencyName":"人民币","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"2df79c1effffcc76879b59beb1b9b2ae01ef","createDate":"2021-04-12 18:47:07","lastUpdateBy":"2df79c1effffcc76879b59beb1b9b2ae01ef","lastUpdateDate":"2021-04-15 21:29:47","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"全国综合业务服务平台","language":"zh-CN","fuLeCode":"XY","fuLeName":"演示公司","bankAccountTypeName":"一般账户","collectionTypeName":"收付款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":"","ticketName":null,"isConnAccount":"","isConnAccountName":null,"isConnTicket":"","isConnTicketName":null,"bankLevel":232343,"sysCompanyBankCurrencyDTOS":[{"id":"521d06d57ec0de7a1303b1b9b2ae001a","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"2df79c1effffcc76879b59beb1b9b2ae01ef","createDate":"2021-04-15 21:29:47","lastUpdateBy":"2df79c1effffcc76879b59beb1b9b2ae01ef","lastUpdateDate":"2021-04-15 21:29:47","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"bfb3e27e710676e5fc8db1b9b2ae002b","currencyId":"a90ec989-483c-4fc6-9eab-d149babcca01","currencyCode":"CNY","currencyName":"人民币"}]},{"id":"56e03a394347e5948db3b1b9b2ae0b38","code":"092901","subBank":"GP039080","bankAccountNum":"092901092901092901","bankAccountName":"092901","bankAccountType":"AN0001","fuId":"4f01c91bffffccd559d1aa8cb1b9b2ae002f","sobId":"4f01c91bffffcccf39e58193b1b9b2ae001f","accountId":null,"accountName":null,"unitedCode":"104562215216","collectionType":"RP0003","city":"娄底","bankTypeCode":"104","inMoneyType":null,"province":"湖南","bankHeadOffice":"中国银行","currencyId":"810649b1-4a71-4ace-acd1-1ccc0deaac79","currencyCode":"USD","currencyName":"美元","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"633ad43effffc071dceffbfab1b9b2ae0511","createDate":"2021-09-29 09:49:16","lastUpdateBy":"633ad43effffc071c0c8dd6bb1b9b2ae0501","lastUpdateDate":"2021-12-10 18:18:26","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"中国银行股份有限公司冷水江市锑都中路支行","language":"zh-CN","fuLeCode":"XY","fuLeName":"演示公司","bankAccountTypeName":"一般账户","collectionTypeName":"收付款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":null,"ticketName":null,"isConnAccount":"Y","isConnAccountName":"是","isConnTicket":"Y","isConnTicketName":"是","bankLevel":99999,"sysCompanyBankCurrencyDTOS":[{"id":"6245d50978d9c71eb718b1b9b2ae0535","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"633ad43effffc071c0c8dd6bb1b9b2ae0501","createDate":"2021-12-10 18:18:26","lastUpdateBy":"633ad43effffc071c0c8dd6bb1b9b2ae0501","lastUpdateDate":"2021-12-10 18:18:26","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"56e03a394347e5948db3b1b9b2ae0b38","currencyId":"810649b1-4a71-4ace-acd1-1ccc0deaac79","currencyCode":"USD","currencyName":"美元"}]},{"id":"56e03a3943565af07df0b1b9b2ae0b3a","code":"092902","subBank":"GP039080","bankAccountNum":"092902092902092902092902092902","bankAccountName":"092902","bankAccountType":"AN0002","fuId":"4f01c91bffffccd559d1aa8cb1b9b2ae002f","sobId":"4f01c91bffffcccf39e58193b1b9b2ae001f","accountId":null,"accountName":null,"unitedCode":"104562215216","collectionType":"RP0003","city":"娄底","bankTypeCode":"104","inMoneyType":null,"province":"湖南","bankHeadOffice":"中国银行","currencyId":"810649b1-4a71-4ace-acd1-1ccc0deaac79","currencyCode":"USD","currencyName":"美元","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"633ad43effffc071dceffbfab1b9b2ae0511","createDate":"2021-09-29 09:50:18","lastUpdateBy":"05ed1113ffffcfc85ca02561b1b9b2ae222f","lastUpdateDate":"2022-05-13 17:29:17","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"中国银行股份有限公司冷水江市锑都中路支行","language":"zh-CN","fuLeCode":"XY","fuLeName":"演示公司","bankAccountTypeName":"基本账户","collectionTypeName":"收付款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":null,"ticketName":null,"isConnAccount":"Y","isConnAccountName":"是","isConnTicket":"Y","isConnTicketName":"是","bankLevel":99998,"sysCompanyBankCurrencyDTOS":[{"id":"a229de954c714fd0baf7b1b9b2ae0167","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"05ed1113ffffcfc85ca02561b1b9b2ae222f","createDate":"2022-05-13 17:29:17","lastUpdateBy":"05ed1113ffffcfc85ca02561b1b9b2ae222f","lastUpdateDate":"2022-05-13 17:29:17","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"56e03a3943565af07df0b1b9b2ae0b3a","currencyId":"810649b1-4a71-4ace-acd1-1ccc0deaac79","currencyCode":"USD","currencyName":"美元"}]},{"id":"ec88a9fe7b1acdab7864b1b9b2ae0142","code":"444","subBank":"GP122341","bankAccountNum":"34567890","bankAccountName":"刘娟所用账户","bankAccountType":"AN0002","fuId":"ec88a9fe75c2a4e9c94cb1b9b2ae0018","sobId":"ec88a9fe75b99cd667a8b1b9b2ae0015","accountId":"131f9cd8ffff965a71e08234b1b9b2ae002d","accountName":"银行存款","unitedCode":"906791000016","collectionType":"RP0003","city":"西安","bankTypeCode":"906","inMoneyType":null,"province":"陕西","bankHeadOffice":"平安银行","currencyId":"0d49df30-8060-46ae-97f1-5d567ad7b94c^a90ec989-483c-4fc6-9eab-d149babcca01","currencyCode":"NAD,CNY","currencyName":"纳币,人民币","remark":null,"validityFlag":"0","enabledFlag":"0","createBy":"cb05ce77-c491-4e30-bc5e-b22f9024a304","createDate":"2021-04-23 11:08:44","lastUpdateBy":"05ed1113ffffcfc85ca02561b1b9b2ae222f","lastUpdateDate":"2021-12-31 15:24:23","groupId":"accba517-5725-4fae-8938-48946676bfc1","boeTypeId":null,"subBankName":"西安金融电子结算中心","language":"zh-CN","fuLeCode":"liujuan","fuLeName":"刘娟用的核算主体","bankAccountTypeName":"基本账户","collectionTypeName":"收付款","validityName":"有效","enabledFlagName":null,"inMoneyTypeName":null,"isRepaymentAccount":null,"isRepaymentAccountName":null,"isDefaultAccount":null,"isDefaultAccountName":null,"ticketId":"","ticketName":null,"isConnAccount":"","isConnAccountName":null,"isConnTicket":"","isConnTicketName":null,"bankLevel":55555,"sysCompanyBankCurrencyDTOS":[{"id":"2c1045a3ffffe18a407d5593b1b9b2ae002f","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"05ed1113ffffcfc85ca02561b1b9b2ae222f","createDate":"2021-12-31 15:24:23","lastUpdateBy":"05ed1113ffffcfc85ca02561b1b9b2ae222f","lastUpdateDate":"2021-12-31 15:24:23","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"ec88a9fe7b1acdab7864b1b9b2ae0142","currencyId":"0d49df30-8060-46ae-97f1-5d567ad7b94c","currencyCode":"NAD","currencyName":"纳币"},{"id":"2c1045a3ffffe18a407aa4b6b1b9b2ae002e","groupId":"accba517-5725-4fae-8938-48946676bfc1","validityFlag":"0","enabledFlag":"0","createBy":"05ed1113ffffcfc85ca02561b1b9b2ae222f","createDate":"2021-12-31 15:24:23","lastUpdateBy":"05ed1113ffffcfc85ca02561b1b9b2ae222f","lastUpdateDate":"2021-12-31 15:24:23","extendS1":null,"extendS2":null,"extendS3":null,"archiveFlag":null,"archiveDate":null,"companyBankId":"ec88a9fe7b1acdab7864b1b9b2ae0142","currencyId":"a90ec989-483c-4fc6-9eab-d149babcca01","currencyCode":"CNY","currencyName":"人民币"}]}]},"type":"INFO"}'
    _obj = json.loads(_obj)
    key_list = ['id', 'fuId', 'validityFlag']
    key = 'id'
    aaa = ZTCCLOUD().GET_VALUES_FROM_JSON_DICT(_obj, key_list, city='上海')
    print(len(aaa), aaa)
    bbb = ZTCCLOUD().GET_VALUES_FROM_JSON_DICT(_obj, key, city='上海')
    print(len(bbb))
